использование GROUP BY в MySQL 8 - PullRequest
0 голосов
/ 13 февраля 2019

Я обновил свой сервер MySQL, и теперь у меня есть проблема с группой по

select * from tickets WHERE `status` = 0 group by `tnumber` ORDER BY `created_at` DESC

. Ошибка:

Список SELECT отсутствует в предложении GROUP BY и содержит неагрегированныестолбец

Обновлено: содержимое моей таблицы:

        <!DOCTYPE html>
        <html>
        <head>
        <style>
        table {
          font-family: arial, sans-serif;
          border-collapse: collapse;
          width: 100%;
        }

        td, th {
          border: 1px solid #dddddd;
          text-align: left;
          padding: 8px;
        }

        tr:nth-child(even) {
          background-color: #dddddd;
        }
        </style>
        </head>
        <body>

        <h2>id</h2>

        <table>
          <tr>
            <th>id</th>
            <th>tnumber</th>
            <th>title</th>
            <th>status</th>
          </tr>
          <tr>
            <td>1</td>
            <td>5c63e00a072c1</td>
            <td>1111</td>
            <td>1</td>
          </tr>
          <tr>
            <td>2</td>
            <td>5c63e00a072c1</td>
            <td>1111</td>
            <td>1</td>
          </tr>
          <tr>
            <td>3</td>
            <td>5c63e00a072c1</td>
            <td>1111</td>
            <td>1</td>
          </tr>
          <tr>
            <td>4</td>
            <td>5c63e00a072c1</td>
            <td>1111</td>
            <td>0</td>
          </tr>
          <tr>
            <td>5</td>
            <td>5c63ead5bd530</td>
            <td>2222</td>
            <td>1</td>
          </tr>
          <tr>
            <td>6</td>
            <td>5c63ead5bd530</td>
            <td>2222</td>
            <td>1</td>
          </tr>
        </table>

        <br/>
        I want to have following output:
        <br/>
        <br/>
        <br/>
        <table>
          <tr>
            <th>id</th>
            <th>tnumber</th>
            <th>title</th>
            <th>status</th>
          </tr>
          <tr>
            <td>1</td>
            <td>5c63e00a072c1</td>
            <td>1111</td>
            <td>0</td>
          </tr>
          <tr>
            <td>2</td>
            <td>5c63ead5bd530</td>
            <td>222</td>
            <td>1</td>
          </tr>
        </table>
        </body>
        </html>

Мой код:

SELECT * FROM tickets 
WHERE `tnumber` IN ( 
                      SELECT tnumber FROM tickets GROUP BY tnumber
                   )  

, но сгруппированы по секундам. Выберите где, нет никаких эффектов !!!Как сделать это более корректно?

Оператор GROUP BY часто используется с агрегатными функциями (COUNT, MAX, MIN, SUM, AVG) для группировки набора результатов по одному или нескольким столбцам.

Ответы [ 3 ]

0 голосов
/ 13 февраля 2019

Если вы группируете по столбцу, результатом будут агрегированные строки.Как говорится в сообщении об ошибке, он не может отображать неагрегированные строки с агрегированным столбцом.Вы можете реструктурировать свой запрос следующим образом:

SELECT `tnumber`
from tickets 
WHERE `status` = 0 
group by `tnumber` 
ORDER BY `tnumber` DESC

Обновить

Если вы хотите получить запись с MAX id, вы можете сделать следующее:

SELECT `usrid` , `tnumber` , `title` , `message` , `status` , `created_at` , `type` 
FROM tickets 
WHERE status = 0
AND `id` IN (
    SELECT MAX(`id`)
    FROM tickets
);
0 голосов
/ 14 февраля 2019

изменить код с:

select * from tickets WHERE `status` = 0 group by `tnumber`;

На:

SELECT * from tickets where id in (SELECT max(id) FROM tickets GROUP BY tnumber) AND `status` = 0;
0 голосов
/ 13 февраля 2019

Судя по вашему вопросу, похоже, что запрос работал до обновления MySql.После того как вы обновили MySql, были применены настройки по умолчанию, что означает, что Only_Full_Group_By включен.Следовательно, если вы хотите выполнить запросы, подобные тому, о котором идет речь, когда неагрегированные столбцы в списке Select отсутствуют в предложении group by, вам необходимо отключить Only_Full_Group_By.

Выполнить оператор ниже и выполнитьВаш запрос еще раз:

SET GLOBAL sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''));

Предупреждение. Это следует делать только в том случае, если вы уверены, что другие неагрегированные столбцы в списке выбора уникальны для каждого tnumber, иначе вы получите случайные строки в видерезультат.

Ниже приводится цитата из MYSQL 8.0 Manual:

MySQL реализует обнаружение функциональной зависимости.Если включен режим SQL ONLY_FULL_GROUP_BY (который по умолчанию), MySQL отклоняет запросы, для которых список выбора, условие HAVING или список ORDER BY ссылаются на неагрегированные столбцы, которые не названы в предложении GROUP BY и функционально не зависят от них..

Если ONLY_FULL_GROUP_BY отключен, расширение MySQL к стандартному использованию SQL GROUP BY позволяет списку выбора, условию HAVING или списку ORDER BY ссылаться на неагрегированные столбцы, даже если столбцы функционально не зависят от GROUP.BY столбцы.Это заставляет MySQL принять предыдущий запрос.В этом случае сервер может выбрать любое значение из каждой группы, поэтому, если они не совпадают, выбранные значения являются недетерминированными, что, вероятно, не то, что вам нужно.Кроме того, на выбор значений из каждой группы нельзя повлиять, добавив предложение ORDER BY.Сортировка набора результатов происходит после выбора значений, и ORDER BY не влияет на то, какое значение в каждой группе выберет сервер.Отключение ONLY_FULL_GROUP_BY полезно прежде всего, когда вы знаете, что из-за некоторого свойства данных все значения в каждом неагрегированном столбце, не названном в GROUP BY, одинаковы для каждой группы.

FOR Подробнее, Нажмите здесь .

...