[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: проблему с COUNT
PiratXXX
Здравствуйте, есть проблемка.
Задача: Извлечь список фотоальбомов из одной таблици и в томже запросе извлесь инфу о фотках которые относятся к каждому альбому. Делаю так:


$Album_list = mysql_query("SELECT AlbumList.*, COUNT(PhotoList.Id) PhotoCnt, PhotoList.Dir CoverDir, PhotoList.Name CoverName, PhotoList.Ext CoverExt, PhotoList.W_sc CoverW, PhotoList.H_sc CoverH FROM `cont_foto_albums_list` AlbumList LEFT JOIN `cont_foto_photos_list` PhotoList ON AlbumList.Id = PhotoList.AlbumId AND PhotoList.Delete = '0' WHERE AlbumList.UserId = '".$UserId."' AND AlbumList.Delete = '0' ".(($UserOwner) ? "" : "AND AlbumList.Access = '3'")."");
while($AlbumInf = mysql_fetch_array($Album_list, MYSQL_ASSOC)) {}


впринципи рабоет но езвлекает оно почемуто только одну запись(самую первую).
и если нет соответствующих записей то цикл всеравно запускаеться...

выяснил что если не считать количество фоток в альбоме то все работает нормально извлекает все нужные записи...

Не могу понять в чем проблема, помогите, заранне спасибо!



Спустя 50 минут, 17 секунд (31.08.2011 - 01:03) Invis1ble написал(а):
Цитата
и если нет соответствующих записей то цикл всеравно запускаеться...

потому что COUNT()

Спустя 1 час, 41 минута, 7 секунд (31.08.2011 - 02:45) PiratXXX написал(а):
Invis1ble

ты имеешь в виду что при count() возвращаеться массив? ну а как мне организовать то что я хочу, что одним запросом тут не обойтись, да?

Спустя 5 часов, 58 минут, 43 секунды (31.08.2011 - 08:43) ИНСИ написал(а):
PiratXXX попробуй так:
mysql_query("
SELECT `c`.*,
IF(`c`.`Id` NOT NULL, ( SELECT COUNT(`Id`) FROM `cont_foto_photos_list` WHERE `AlbumId` = `c`.`Id`), 0) AS `sizeOf`
FROM `cont_foto_albums_list` AS `c`
WHERE `c`.`UserId` = '"
.$UserId."' AND `c`.`Delete` = '0' ".(($UserOwner) ? "" : "AND `c`.`Access` = '3'")."
"
);

Я твою задачу не совсем понял. Запрос работает так: Вытаскивает все альбомы и также подсчитывает количество фоток в этом альбоме или тебе что-то другое надо?

Спустя 43 минуты, 26 секунд (31.08.2011 - 09:27) linker написал(а):
Банальный COUNT() и GROUP BY спасут отца русской дерьмократии.

Спустя 45 минут, 2 секунды (31.08.2011 - 10:12) ИНСИ написал(а):
Цитата
спасут отца русской дерьмократии

Уже не первый раз замечаю, что не следишь за словами. Если знаешь больше чем другие, не дает право так высказываться.

Спустя 18 минут, 43 секунды (31.08.2011 - 10:30) linker написал(а):
Не надо слишком политизировать, что-либо сказанное, на программистском форуме. Тем более в, уже ныне, крылатом и немного перефразированном мной выражении. А мои знания не более чем у многих, тем более мои убеждения противоречат твоим причинно-следственным связям, для непонятливых - чем больше я знаю, тем меньше я допускаю некорректного отношения к менее знающим. Ну и хорошее чувство юмора тоже играет немаловажную роль, зануды тихо шлёпают лесом.

Спустя 6 часов, 39 минут, 2 секунды (31.08.2011 - 17:09) PiratXXX написал(а):
linker

чет оно не спасает ситуацию, вот сделал так:

$Album_list = mysql_query("SELECT AlbumList.*, COUNT(PhotoList.Id), PhotoList.Dir CoverDir, PhotoList.Name CoverName, PhotoList.Ext CoverExt, PhotoList.W_sc CoverW, PhotoList.H_sc CoverH FROM `cont_foto_albums_list` AlbumList LEFT JOIN `cont_foto_photos_list` PhotoList ON AlbumList.Id = PhotoList.AlbumId AND PhotoList.Delete = '0' WHERE AlbumList.UserId = '".$UserId."' AND AlbumList.Delete = '0' ".(($UserOwner) ? "" : "AND AlbumList.Access = '3'")." GROUP BY PhotoList.AlbumId");


все равно достает только первую запись(((

Спустя 6 часов, 14 минут, 3 секунды (31.08.2011 - 23:24) Лена написал(а):
Не будет оно так работать.
При COUNT(), если в запросе есть другие поля, по ним должна быть группировка (GROUP BY) - так делают при использовании агрегатных функций.
Вместо AlbumList.* - надо перечислить все поля этой таблицы и по ним сделать группировку. Плюс группировку по всем остальным полям, задействованным в запросе.


$Album_list = mysql_query("SELECT AlbumList.*,
COUNT(PhotoList.Id),
PhotoList.Dir CoverDir,
PhotoList.Name CoverName,
PhotoList.Ext CoverExt,
PhotoList.W_sc CoverW,
PhotoList.H_sc CoverH

FROM `cont_foto_albums_list` AlbumList
LEFT JOIN `cont_foto_photos_list` PhotoList ON AlbumList.Id = PhotoList.AlbumId
AND PhotoList.Delete = '0'
WHERE AlbumList.UserId = '"
.$UserId."'
AND AlbumList.Delete = '0' "
.(($UserOwner) ? "" : "AND AlbumList.Access = '3'")."
GROUP BY PhotoList.AlbumId,
PhotoList.Dir CoverDir,
PhotoList.Name CoverName,
PhotoList.Ext CoverExt,
PhotoList.W_sc CoverW,
PhotoList.H_sc CoverH
"
);



Я бы сделала двумя запросами. Сначала выбрать альбомы, после - посчитать количество. Меньше запутаетесь.

Спустя 8 часов, 58 минут, 10 секунд (1.09.2011 - 08:22) linker написал(а):
SELECT 
AlbumList.*,
COUNT(PhotoList.Id),
PhotoList.Dir CoverDir,
PhotoList.Name CoverName,
PhotoList.Ext CoverExt,
PhotoList.W_sc CoverW,
PhotoList.H_sc CoverH
FROM
`cont_foto_albums_list` AlbumList
LEFT JOIN
`cont_foto_photos_list` PhotoList
ON
AlbumList.Id = PhotoList.AlbumId AND PhotoList.Delete = '0'
WHERE
AlbumList.UserId = '".$UserId."'
AND
AlbumList.Delete = '0' ".(($UserOwner) ? "" : "AND AlbumList.Access = '3'")."
GROUP BY AlbumList.Id
Группируют по тому полю, от которого будет зависеть результат. Если ты выбираешь список альбомов, то смотришь на то, что у тебя стоит после FROM. Это будет таблица группировки, дальше ключ уникальности альбомы - это идентификатор, т.е. поле Id. Получается что, группировать нужно GROUP BY AlbumList.Id


_____________
http://flibro.com/
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.