2016-09-28 107 views
0

条款组选定我使用MySQL会不工作

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

根据下表,我应该得到1行,我只有一个发送者和我有3排共消息,如果我是“B”

表聊天

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

+1

是否要连接来自一个发件人的所有答案,而不考虑目的地?如果有数以百计的答案,或者长时间回答您的消息变量需要处理的话,该怎么办? – Linkan

+1

请包括您的预期输出。 –

+0

您使用的是哪个版本的mysql? –

回答

0

您需要在select中使用分组列。(编者重拳出击,这是由编辑的回答否定的不实陈述。)

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

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

这使得mkysoft的断言:

您需要选择使用分组列。

完全错误不负责任/非常误导来,让读者。

我将使用下面的表结构&数据表明一些简单的查询:

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读者带来混乱。