У меня есть две таблицы (страна и утки), где в таблице стран есть каждая страна в мире, а таблица уток содержит список уток с полем country_id для ссылки на основную страну.
Я пытаюсь получить список только стран, в которых, по крайней мере, одна утка, и с этим единственным совпадающим записям из таблицы уток для наивысшей оценки в этой стране. Пока у меня есть:
SELECT * FROM country c INNER JOIN ducks d ON c.id = d.country_id ORDER BY c.country ASC, d.rating DESC
Это возвращает список каждой утки, а не только одну страну.
Я был бы признателен, если бы кто-нибудь мог указать мне в правильном направлении. Я бы предпочел сделать это в SQL, чем отдельный запрос для каждой страны, чтобы вытащить самую популярную утку.
SELECT c.*, d.* FROM country c INNER JOIN ducks d ON d.id = --- guessing the ducks Primary Key here ( SELECT dd.id --- and here FROM ducks dd WHERE c.id = dd.country_id ORDER BY dd.rating DESC LIMIT 1 )
Индекс по (country_id, rating, id)
для таблицы MyISAM или (country_id, rating)
для таблицы InnoDB поможет.
В этом запросе будет отображаться только одна duck
на страну, даже если у нее более одного рейтинга. Если вы хотите, чтобы утки с привязанным рейтингом появлялись, используйте ответ @ GROUP BY
@ imm.
Вы можете попробовать просто добавить выбранное соединение, для
SELECT c.*, d.* FROM country c INNER JOIN ducks d ON c.id = d.country_id LEFT JOIN ducks d2 ON d.country_id = d2.country_id AND d2.rating > d.rating WHERE d2.id IS NULL
Вы можете попробовать:
SELECT c.*, d.* FROM country c INNER JOIN ( SELECT d.country_id, d.id, MAX(d.rating) AS rating FROM ducks d GROUP BY d.country_id ) q ON (q.country_id = c.id) INNER JOIN ducks d ON (d.country_id, d.rating) = (q.country_id, q.rating)
Попробуй это:
SELECT c.country, MAX(d.rating) AS max_rating FROM country c JOIN ducks d ON c.id = d.country_id GROUP BY c.id ORDER BY c.country ASC
Если «самый высокий рейтинг» равен 1, измените MAX(d.rating)
на MIN(d.rating)
Многие базы данных имеют некоторый эквивалент «select top 10 * from …». В mySql синтаксис будет «select * from … limit 10».
… НО …
В этом случае вам действительно нужны «group by» и «max ()»!