Задача: вывести все страны, для которых есть хотя бы одно фото, общее кол-во фотографий в скобках и самое свежее фото около страны.
Структура данных:
countries: country_id | country
gallery: gallery_id | title | filename | post_date | country_id
Запрос:
SELECT c.`country` , COUNT( * ) AS `cnt`
FROM `countries` AS c
INNER JOIN `gallery` AS g ON c.`country_id` = g.`country_id`
GROUP BY c.`country`
Позволяет получить перечень стран в виде Россия [54]
И далее прохожусь в цикле:
while ( $j = mysql_fetch_assoc ($result) )
{
echo $j['country'] ." [".$j['cnt']."] ";
$query = "SELECT filename
FROM gallery
WHERE country_id = '$j[country_id]'
ORDER BY post_date DESC
LIMIT 1";
$result = mysql_query($query); $data = mysql_fetch_assoc($result);
echo $data['filename'];
}
Вопрос: можно ли в данном случае обойтись без запроса в цикле,
а получить всю информацию одним запросом? Спасибо
Спустя 27 минут, 46 секунд (2.08.2012 - 17:10) DarkLynx написал(а):
while ( $j = mysql_fetch_assoc ($result) )
{
echo $j['country'] ." [".$j['cnt']."] ";
$query = "SELECT filename
FROM gallery
WHERE country_id = '$j[country_id]'
ORDER BY post_date DESC
LIMIT 1";
$result = mysql_query($query); $data = mysql_fetch_assoc($result);
echo $data['filename'];
}
while ( $j = mysql_fetch_assoc ($result) )
{
echo $j['country'] ." [".$j['cnt']."] ";
$ids[] = $j['country_id'];
}
$strIds = implode(',', $ids);
$query = "SELECT filename
FROM gallery
WHERE country_id IN (".$strIds.")
ORDER BY post_date DESC";
$result = mysql_query($query);
$data = mysql_fetch_assoc($result);
Получаешь массив всех фотографий с идами которые искал
Спустя 2 минуты, 53 секунды (2.08.2012 - 17:13) KonstRuctor написал(а):
То есть вместо кучи запросов в цикле использую всего 2 запроса,
после чего разбираю данные.
Спасибо за идею, попробую!
после чего разбираю данные.
Спасибо за идею, попробую!
Спустя 1 час, 52 минуты, 11 секунд (2.08.2012 - 19:05) killer8080 написал(а):
SELECT c.`country` , COUNT( * ) AS `cnt`, `g`.`filename`
FROM `countries` AS c
INNER JOIN `gallery` AS g ON c.`country_id` = g.`country_id`
GROUP BY c.`country`
ORDER BY `g`.`post_date` DESC
А так не подходит?
Спустя 3 часа, 33 минуты, 30 секунд (2.08.2012 - 22:38) KonstRuctor написал(а):
DarkLynx
Не выходит, запутался я совсем. Буду делать запрос в цикле, иначе не одолеть.
Я придумал немного упростить: в первом запросе я не могу сразу выбрать имя файла самой свежей фотографии, но зато могу написать
MAX(gallery.gallery_id), выбрав таким образом самое последнее gallery_id
Что, в принципе, должно и быть самым свежим по логике.
Дальше все же делаю запрос в цикле, выясняя по этому id имя файла.
Из вашего кода я не понимаю, как мне вывести данные в виде,
-----------------------------
| filename | country | cnt |
| filename | country | cnt |
| filename | country | cnt |
-----------------------------
Не выходит, запутался я совсем. Буду делать запрос в цикле, иначе не одолеть.
Я придумал немного упростить: в первом запросе я не могу сразу выбрать имя файла самой свежей фотографии, но зато могу написать
MAX(gallery.gallery_id), выбрав таким образом самое последнее gallery_id
Что, в принципе, должно и быть самым свежим по логике.
Дальше все же делаю запрос в цикле, выясняя по этому id имя файла.
Из вашего кода я не понимаю, как мне вывести данные в виде,
-----------------------------
| filename | country | cnt |
| filename | country | cnt |
| filename | country | cnt |
-----------------------------