использование GROUP BY в MySQL 8

Я обновил свой сервер 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>

1

Решение

измените свой код с:

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;
1

Другие решения

Исходя из вашего вопроса, похоже, что запрос работал должным образом до 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 реализует обнаружение функциональной зависимости. Если
ONLY_FULL_GROUP_BY включен режим SQL (который по умолчанию), MySQL
отклоняет запросы, для которых список выбора, условие HAVING или ORDER
Список BY относится к неагрегированным столбцам, которые не названы ни в
Предложение GROUP BY ни функционально не зависит от них.

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

Для получения дополнительной информации, Кликните сюда.

3

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

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
);
1
По вопросам рекламы [email protected]