我正在使用
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
不兼容
答案 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断言:
对SO读者来说,完全错误和不负责任/非常误导。您需要在select中使用分组列。
我将使用下面的表格结构演示一些简单的查询。数据:
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");