Задача: Извлечь список фотоальбомов из одной таблици и в томже запросе извлесь инфу о фотках которые относятся к каждому альбому. Делаю так:
$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() возвращаеться массив? ну а как мне организовать то что я хочу, что одним запросом тут не обойтись, да?
ты имеешь в виду что при 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.* - надо перечислить все поля этой таблицы и по ним сделать группировку. Плюс группировку по всем остальным полям, задействованным в запросе.
Я бы сделала двумя запросами. Сначала выбрать альбомы, после - посчитать количество. Меньше запутаетесь.
При 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Группируют по тому полю, от которого будет зависеть результат. Если ты выбираешь список альбомов, то смотришь на то, что у тебя стоит после FROM. Это будет таблица группировки, дальше ключ уникальности альбомы - это идентификатор, т.е. поле Id. Получается что, группировать нужно GROUP BY AlbumList.Id
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
_____________
http://flibro.com/