2012-10-03 40 views
2

我有我的產品表-name和品牌的2列,給出的數據,Mysql的組由多條選擇

NAME    BRAND 
'Ruby Axe Guitar', 'Guitar''s & Co' 
'TV'    , 'LG' 

當我試圖此查詢其做工精細,

select name,brand, sum(1000) as sum,'Test' as name1 
from products 
group by name,brand 

但我得到了,即使我不包括品牌group by子句中的查詢工作的罰款驚訝..

select name,brand, sum(1000) as sum,'Test' as name1 
from products 
group by name 

有人可以解釋嗎?

+0

如果你的名字有多個值,那麼您的查詢工作不細..... – jainvikram444

回答

0

不能選擇沒有聚合函數的未分組的行 - MySQL會給你隨機值。我想你是幸運的這第二個查詢

0

因爲NAME已與您的數據唯一,所以GROUP BY NAME是相同的GROUP BY NAME, OTHER_FIELD

NAME是唯一的,那麼與任何其他列的組合是獨一無二的。

0

MySQL比它應該是恕我直言,嚴厲不少。根據實際的SQL規範,任何未分組的列在包含GROUP BY子句的查詢中都需要aggregate function

MySQL將允許檢索沒有這些聚集函數的非分組列,返回任意值。他們有這種選擇的explanation其文檔中:

MySQL的擴展使用GROUP BY的,這樣的選擇列表可參考 在GROUP BY子句中未命名的非聚合列。這意味着 前面的查詢在MySQL中是合法的。您可以使用此功能 以避免不必要的列排序和 分組以獲得更好的性能。但是,這對於每個 組中未在GROUP BY中指定的每個 非聚合列中的所有值都相同時都很有用。服務器可以自由選擇每組中的任何值,因此除非它們相同,否則所選的值是不確定的。

0

我相信它的目的是作爲一個被忽視的疏忽。通常,您需要將任何非聚合的列包含到「GROUP BY」子句中。但是,MySQL基本上抓取了列的第一個條目,而不是它遇到的集合的一部分。

這可能是好的,比如對錶/列進行查詢,不管相應的組中有多少條記錄,它們都不會改變。例如。你需要一個客戶名單和他們的總訂單。訂單表中有一個客戶ID加入客戶表。所以,你可以做一個SUM(Orders.Amount),但仍然可以獲得客戶ID,姓名,地址,電話。由於加入的是客戶ID,因此相應的名稱,地址等將不會改變,因此在組內並不重要。只需按客戶ID進行分組。

因此,MySQL不會對你窒息,如果你在不經意間留下了一列...