Intereting Posts
Перехват маршрута Laravel Почему я не могу использовать session_start () в моем php-скрипте? Он говорит, что заголовки уже отправлены Пропустить Checkout в Magento для загружаемого продукта Каковы общие рекомендации по использованию магии для геттеров и сеттеров? Переменная PHP, определенная в «родительском» файле, не распознанная в «обязательном» файле Защищенные статические переменные-члены Удаление всех символов перед определенной строкой Подключение к mongodb с использованием драйвера PDO Необходимо заменить слова в тексте специальными синонимами как установить таймаут в методе vueJs Является ли код после заголовка («Расположение: …) выполнен? Проблемы с ретранслятором и php cli PHP Как заблокировать прокси с моего сайта? Использование короткого замыкания для получения первой ненулевой переменной Отображение результатов гиперссылок, таких как поисковая система

MySQL возвращает первую строку объединенной таблицы

У меня есть две таблицы (страна и утки), где в таблице стран есть каждая страна в мире, а таблица уток содержит список уток с полем 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 ()»!