SELECT MAX from COUNT, другие переменные строки не верны - PullRequest
0 голосов
/ 04 ноября 2018

Я пытаюсь выбрать МАКС СЧЕТА, группируя их по состоянию (поэтому по одному максимуму для каждого отдельного значения в состоянии). Функция подсчета работает как задумано.

SELECT c.id, c.name, t.name as type, COUNT(*) as count, c.state 
FROM bookings_facilities f 
JOIN bookings b 
ON b.id = f.booking_id 
JOIN clients c 
ON c.id = b.client_id 
JOIN client_types t 
ON c.type = t.id 
WHERE t.name = "School" 
GROUP BY c.id

Вот результаты,

Image 1

Я использую приведенный ниже оператор SQL, чтобы попытаться выбрать МАКСИМАЛЬНОЕ число, сгруппировав их по штатам.

SELECT *, MAX(z.count) 
FROM (SELECT c.id, c.name, t.name as type, COUNT(*) as count, c.state 
    FROM bookings_facilities f 
    JOIN bookings b 
    ON b.id = f.booking_id 
    JOIN clients c 
    ON c.id = b.client_id 
    JOIN client_types t 
    ON c.type = t.id 
    WHERE t.name = "School" 
    GROUP BY c.id) z
GROUP BY z.state

Вот результаты, image 2

3 состояния, которые появляются только один раз в result 1, кажутся хорошими, но для состояния Selangor, которое появляется дважды в первом результате, возникли некоторые проблемы.

Запрос SQL выбрал правильное значение MAX (Количество), равное 6, но вместо того, чтобы возвращать идентификатор как 1027, он возвращал идентификатор как 1002, который имеет только 1 в первом результате.

Я пробовал использовать разные наборы данных, но не могу получить подробную информацию о фактической строке MAX (Count).

Вот дизайн базы данных для справки ER

SQL Fiddle

Ожидаемый результат: (Нужно изменить только вывод второй строки). Output Токовый выход Link

1 Ответ

0 голосов
/ 04 ноября 2018

Поскольку вы можете использовать MySQL 8.0 , мы можем решить вашу проблему, используя Функции окна . Для раздела state мы определим Row_Number() для строки, имеющей наибольшее число в качестве строки № 1, и так далее. Теперь нам просто нужно рассмотреть только те строки, где номер строки равен 1, для конкретного state.

Дополнительно , при вашей попытке GROUP BY не был допустимым SQL. Старые версии MySQL были снисходительны и позволяли это; но новые версии этого не делают, если вы не отключите строгий режим only_full_group_by. Тем не менее, вы не должны отключать его, а вместо этого исправить запрос. Основная суть в том, что при использовании Group By ваше предложение Select должно содержать только агрегированные столбцы / выражения / выражения и / или столбцы / выражения / выражения, определенные в предложении Group By. , Прочитайте: Ошибка, связанная с only_full_group_by при выполнении запроса в MySql

 SELECT dt2.id,
       dt2.NAME,
       dt2.state,
       dt2.type,
       dt2.count
FROM   (SELECT dt1.id,
               dt1.NAME,
               dt1.state,
               dt1.type,
               dt1.count,
               Row_number()
                 OVER (
                   partition BY dt1.state
                   ORDER BY dt1.count DESC) AS row_num
        FROM   (SELECT c.id,
                       c.NAME,
                       c.state,
                       t.NAME   AS type,
                       Count(*) AS count
                FROM   bookings_facilities AS f
                       JOIN bookings AS b
                         ON b.id = f.booking_id
                       JOIN clients AS c
                         ON c.id = b.client_id
                       JOIN client_types AS t
                         ON c.type = t.id
                WHERE  t.NAME = 'School'
                GROUP  BY c.id,
                          c.NAME,
                          c.state,
                          type) AS dt1) AS dt2
WHERE  dt2.row_num = 1  

Результат:

| id   | NAME                                     | state     | type   | count |
| ---- | ---------------------------------------- | --------- | ------ | ----- |
| 1006 | Holy Child Montessory School Of Fairview | Manila    | School | 1     |
| 1027 | Sri Kuala Lumpur                         | Selangor  | School | 6     |
| 1010 | Singapore American School                | Singapore | School | 1     |
| 1015 | Keika Junior & Senior High School        | Tokyo     | School | 1     |

Просмотр на БД Fiddle

...