MySQL select group by 子句不起作用

标签 mysql

我正在使用

mysqli_query($con, "SELECT * FROM chat GROUP BY sender");

根据下表,我应该得到 1 行,其中我只有一个发件人,如果我是“b”,则总共有 3 行消息

table 上聊天

sender    destination   message
| a |     | b        |  |  ..  |
| b |     | a        |  |  ..  |
| a |     | b        |  |      |
| a |     | b        |  |      |
| b |     | a        |  |      |

我收到此错误消息

ERROR 1055 (42000): Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'chat.chat.id' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by

最佳答案

GROUP BY 并不否认在 SELECT 子句中使用通配符 (*) 的能力,也不要求 GROUP BY 列包含在 SELECT 子句中。

这使得mkysoft的断言:

You need to use grouped column in select.

完全错误,并且对读者不负责任/严重误导

我将使用以下表结构和数据演示一些简单的查询:

CREATE TABLE `chat` (
  `sender` varchar(10) NOT NULL,
  `destination` varchar(10) NOT NULL,
  `message` varchar(255) NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1;

INSERT INTO `chat` (`sender`, `destination`, `message`) VALUES
('a', 'b', 'm1'),
('b', 'a', 'm2'),
('a', 'b', 'm3'),
('a', 'b', 'm4'),
('b', 'a', 'm5');

使用此查询获取具有唯一 sender-destination 对的所有行中的所有列:

SELECT * FROM `chat` GROUP BY `sender`,`destination`

输出将是:

sender    destination    message
a         b              m1
b         a              m2
<小时/>

使用此查询从具有唯一senders的行中获取destination列:

SELECT `destination` FROM `chat` GROUP BY `sender`

输出将是:

destination
b
a
<小时/>

使用此查询获取所有行中的所有列:

SELECT * FROM `chat`

输出将是:

sender    destination    message
a         b              m1
b         a              m2
a         b              m3
a         b              m4
b         a              m5
<小时/>

使用此查询从所有行获取所有三列,将所有列按升序排列,从 sender 开始,然后 destination,然后 message :

SELECT `sender`,`destination`,`message` FROM `chat` ORDER BY `sender`,`destination`,`message`

输出将是:

sender    destination    message
a         b              m1
a         b              m3
a         b              m4
b         a              m2
b         a              m5
<小时/>

使用此查询将分组值附加到单个字符串中,并以换行符作为“粘合剂”:

SELECT `sender`,`destination`,GROUP_CONCAT(`message` SEPARATOR '\n') AS `all_mess` FROM `chat` GROUP BY `sender`,`destination`

输出将是:

sender    destination    all_mess
a         b              m1
                         m3
                         m4
b         a              m2
                         m5

您可以在 GROUP_CONCAT() 中选择您喜欢的任何分隔符功能。

包裹所有列名和别名的反引号是可选的。

您可以决定如何处理和显示结果集。

根据问题中的错误陈述,您似乎正在引用数据库:chat,表:chat,列:id 其中未包含在 SELECT * FROM chat GROUP BY sender 的 sql 字符串中或问题中的任何位置 - 由于这种不一致,我无法提供帮助。

如果有人想使用此示例表尝试一些查询,您可以使用此 SQLFiddle Demo .

希望这可以消除您和 SO 读者的任何困惑。

关于MySQL select group by 子句不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39740460/

相关文章:

MySQL - 按在 'IN' 语句中找到的值的次数排序

mysql - 分组后的随机数据

mysql - 忽略 mysql 查询中的 0 值

MySQL:从 Boolean 到 Tinyint(1) 再返回

mysql - 当其他列的其他结果相同时,如何对sql中的结果求和?

php - 更新两行 - MySQL

java - 使用 spring 和 mysql 将来自 UI 的数据保存为草稿

MySQL GROUP_CONCAT 和多个查找表

MYSQL查询十亿条记录超时问题

php - 第 1 行 SQL 语法错误?