Выберите отдельный столбец вместе с некоторыми другими столбцами в MySQL - PullRequest
27 голосов
/ 18 декабря 2011

Кажется, я не могу найти подходящего решения для следующей (вероятно, старой) проблемы, так что надеюсь, что кто-то сможет пролить свет. Мне нужно вернуть 1 отдельный столбец вместе с другими не отличными столбцами в MySQL.

У меня есть следующая таблица в mySQL:

id      name       destination     rating     country
----------------------------------------------------
1       James      Barbados        5          WI
2       Andrew     Antigua         6          WI
3       James      Barbados        3          WI
4       Declan     Trinidad        2          WI
5       Steve      Barbados        4          WI
6       Declan     Trinidad        3          WI

Я бы хотел, чтобы оператор SQL возвращал имя DISTINCT вместе с пунктом назначения, рейтинг в зависимости от страны.

id      name       destination     rating     country
----------------------------------------------------
1       James      Barbados        5          WI
2       Andrew     Antigua         6          WI
4       Declan     Trinidad        2          WI
5       Steve      Barbados        4          WI

Как видите, у Джеймса и Деклана разные рейтинги, но одно и то же имя, поэтому они возвращаются только один раз.

Следующий запрос возвращает все строки, поскольку рейтинги отличаются. Можно ли в любом случае вернуть вышеуказанный набор результатов?

SELECT (distinct name), destination, rating 
  FROM table 
 WHERE country = 'WI' 
 ORDER BY id

Ответы [ 4 ]

24 голосов
/ 18 декабря 2011

Используя подзапрос, вы можете получить максимальное значение id для каждого имени, а затем выбрать остальные строки на основе этого:

SELECT * FROM table
WHERE id IN (
  SELECT MAX(id) FROM table GROUP BY name
)

Если вы предпочитаете, используйте MIN(id) дляполучить первую запись для каждого имени вместо последнего.

Это также можно сделать с INNER JOIN против подзапроса.Для этого производительность должна быть одинаковой, и иногда вам нужно объединить в два столбца из подзапроса.

SELECT
  table.*
FROM 
  table
  INNER JOIN (
    SELECT MAX(id) AS id FROM table GROUP BY name
  ) maxid ON table.id = maxid.id
4 голосов
/ 18 декабря 2011

Проблема заключается в том, что различные операции работают по всему возвращаемому набору, а не только по первому полю. В противном случае MySQL не будет знать, какую запись вернуть. Итак, вы хотите иметь какую-то групповую функцию для оценки, будь то MAX, MIN, GROUP_CONCAT, AVG или несколько других функций.

Майкл уже опубликовал хороший ответ, поэтому я не собираюсь переписывать запрос.

3 голосов
/ 18 декабря 2011

Вы можете сделать group by:

select min(id) as id, name, destination, avg(rating) as rating, country from TABLE_NAME group by name, destination, country
2 голосов
/ 10 марта 2012

Я согласен с @rcdmk.Использование подзапроса DEPENDENT может снизить производительность, поэтому GROUP BY кажется более подходящим при условии, что вы уже проиндексировали поле country и только несколько строк достигнут сервера.Переписав запрос giben с помощью @rcdmk, я добавил предложение ORDER BY NULL , чтобы подавить неявное упорядочение с помощью GROUP BY, чтобы сделать его немного быстрее:

SELECT MIN(id) as id, name, destination as rating, country 
FROM table WHERE country = 'WI' 
GROUP BY name, destination ORDER BY NULL
...