MySQL选择group by子句不起作用

时间:2016-09-28 07:13:35

标签: mysql

我正在使用

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

根据下表我应该得到1行,其中我只有一个发件人,如果我是' b'

我总共有3行信息

表聊天

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

我收到此错误消息

  

错误1055(42000):SELECT列表的表达式#1不在GROUP BY子句中,并且包含非聚合列' chat.chat.id'它在功能上不依赖于GROUP BY子句中的列;这与sql_mode = only_full_group_by

不兼容

2 个答案:

答案 0 :(得分:1)

GROUP BY并不否认在*子句中使用通配符(SELECT)的能力,也不要求GROUP BY列中包含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'); 条款。

这使mkysoft断言:

  

您需要在select中使用分组列。

对SO读者来说,完全错误不负责任/非常误导

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

sender

使用此查询从所有行中获取具有唯一destination - SELECT * FROM `chat` GROUP BY `sender`,`destination` 对的所有列:

sender    destination    message
a         b              m1
b         a              m2

输出将是:

destination

使用此查询从具有唯一senders的行中获取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

输出将是:

chat

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

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

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

根据问题中的错误声明,您似乎引用了数据库:chat,表:id,列:SELECT * FROM chat GROUP BY sender,它未包含在您的sql字符串{ {1}}或您问题中的任何地方 - 由于这种不一致,我无能为力。

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

希望这能为你和SO读者解除任何困惑。

答案 1 :(得分:0)

你需要在select中使用分组列。(编辑罢工,这是一个不真实的陈述,由编辑的​​答案反驳。)

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