2016-09-28 97 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讀者帶來混亂。