Как я могу выбрать строки со значением Max, DISTINCT по другому столбцу в MYSQL

0

У меня есть эта таблица примеров:

id        city       show    
-------  -------    ------ 
 1        Paris     Show1
 2        NY        Show1
 3        Paris     Show2
 4        Madrid    Show3
 5        Madrid    Show3
 6        NY        Show2
 7        NY        Show1
 8        Paris     Show2

Plz может помочь мне с запросом MySQL, чтобы получить наиболее заметное шоу по городу. Результат должен выглядеть следующим образом:

city      Show      Occurence
 NY       Show1        2
Paris     Show2        2
Madrid    Show3        2

Я буду очень благодарен за вашу помощь.

  • 0
    ВЫБРАТЬ город, показать, посчитать (показать) ИЗ таблицы ГРУППА ПО городу
Теги:

2 ответа

1
Лучший ответ

Там очень простой способ сделать это в mysql:

SELECT * FROM (
    SELECT 
       city, 
       'show', 
       count(id)  
    FROM 
       showTable 
    GROUP BY 
       city,'show' 
    ORDER BY 
       count(id) 
    DESC
) as temp 
GROUP BY 
  city

Это работает, потому что в mysql вам запрещено группировать столбцы без группы, и в этом случае mysql просто возвращает первую строку. Решение состоит в том, чтобы сначала заказать данные таким образом, чтобы для каждой группы сначала была нужна строка, а затем группировать по столбцам, для которых требуется значение (в данном случае - city).

Обратите внимание, что упорядочение запроса INNER очень важно. Иначе порядок не определен, поэтому использование GROUP BY без агрегации (по внешнему запросу) будет время от времени возвращать другую строку. (Вы также столкнетесь с этим, если два шоу имеют равный счет в одном городе - иногда он будет возвращать "showX", иногда "showY")

http://sqlfiddle.com/#!9/0b887/7

(После тестирования запроса я нашел здесь хорошо написанный оператор, в основном тот же вопрос - так что не нужно писать самостоятельно: Получить записи с максимальным значением для каждой группы сгруппированных SQL-результатов)

ps.: Если вы проверите эту скрипту: http://sqlfiddle.com/#!9/7a9be9/1 - TESTTOWN будет время от времени чередовать между show1 и show2.

  • 0
    Но обратите внимание, что это называется (недокументированным) «взломать»
  • 0
    Порядок неопределен независимо. Текущая версия (и все предыдущие версии) MySQL как раз и делает это правильно, но это может измениться в версии 11 !!
Показать ещё 7 комментариев
1

Например:

DROP TABLE IF EXISTS my_table;

CREATE TABLE my_table
(id INT NOT NULL AUTO_INCREMENT PRIMARY KEY
,city VARCHAR(12) NOT NULL
,performance VARCHAR(12) NOT NULL
);

INSERT INTO my_table VALUES
(1,'Paris'     ,'Show1'),
(2,'NY'        ,'Show1'),
(3,'Paris'     ,'Show2'),
(4,'Madrid'    ,'Show3'),
(5,'Madrid'    ,'Show3'),
(6,'NY'        ,'Show2'),
(7,'NY'        ,'Show1'),
(8,'Paris'     ,'Show2');   


 SELECT x.*
      , z.total
   FROM my_table x
   JOIN
      ( SELECT city, MAX(id) max_id FROM my_table GROUP BY city ) y
     ON y.city = x.city
    AND y.max_id = id
   JOIN (SELECT city, performance, COUNT(*) total FROM my_table GROUP BY city,performance) z
     ON z.city = x.city 
    AND z.performance = x.performance;

+----+--------+-------------+-------+
| id | city   | performance | total |
+----+--------+-------------+-------+
|  5 | Madrid | Show3       |     2 |
|  7 | NY     | Show1       |     2 |
|  8 | Paris  | Show2       |     2 |
+----+--------+-------------+-------+

Ещё вопросы

Сообщество Overcoder
Наверх
Меню