Я обновил свой сервер 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 `status` = 0 group by `tnumber`;
Для того, чтобы:
SELECT * from tickets where id in (SELECT max(id) FROM tickets GROUP BY tnumber) AND `status` = 0;
Исходя из вашего вопроса, похоже, что запрос работал должным образом до 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 одинаковы для каждой группы.
Для получения дополнительной информации, Кликните сюда.
Если вы группируете по столбцу, результатом будут агрегированные строки. Как говорится в сообщении об ошибке, он не может отображать неагрегированные строки с агрегированным столбцом. Вы можете реструктурировать свой запрос следующим образом:
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
);