[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Сложная выборка из двух таблиц
KonstRuctor
Есть две таблицы: страны и фотографии, сделанные в этих странах.
Задача: вывести все страны, для которых есть хотя бы одно фото, общее кол-во фотографий в скобках и самое свежее фото около страны.
Структура данных:
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 |
-----------------------------
Быстрый ответ:

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