У меня есть эта таблица примеров:
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
Я буду очень благодарен за вашу помощь.
Там очень простой способ сделать это в 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.
Например:
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 |
+----+--------+-------------+-------+