2011-11-08 31 views
0

我在查詢中使用了group by子句。我想通過參數獲得未在組中指定的其他列如何獲取此查詢中的其他列

SELECT un.user, un.role 
FROM [Unique] un 
group by user, role 

在關於[Unique]的查詢中共有7列。我如何獲得其他列?

回答

3

在大多數數據庫(MySQL的和SQLite是我所知道的例外),你可以不包括一組列,按Select,除非:

  1. 列包含在GROUP BY子句。

  2. 該列爲合計在其中一個受支持的聚合函數中。

在MySQL和SQLite中,從中獲取額外值的聚合組內的行未定義。

如果你想在任何其他發動機額外的列,你可以用在MAX()列名:

SELECT un.user, un.role, MAX(un.city), MAX(un.bday) 
FROM [Unique] un 
GROUP BY user, role 

在這種情況下,多餘的列中的值可能來自不同輸入記錄集中的行。如果這很重要(有時候不是因爲多餘的列來自一對多JOIN的一邊),所以你不能使用這種技術。

需要說明的是:如果您在SELECT中使用GROUP BY,那麼您返回的每一行都是由組中的構成的。如果您包含不屬於GROUP BY子句的列,那麼您不會向引擎發送上的任何指令,其中表中要從該表讀取的值。因此,大多數引擎不允許你運行這種SQL。 MySQL確實有結果,但我個人認爲這是不好的做法。

+0

完美,我明白爲什麼我現在必須使用MAX。謝謝 – Luke101

0

你試過指定它們嗎?

SELECT un.user, un.role, un.col3, un.col4 
FROM [Unique] un 
group by user, role 
0

您需要使用Order By來獲得額外的列。或者最終通過指定組中的每一列。

1

你必須選擇你想要的其他列的依據。如果同一個用戶/角色存在多個條目,您是否想要第一個/最後一個/隨機?您必須在其他列上做出選擇,通過彙總它們或選擇將它們包括在按語句組合中。

有些RDBMS確實提供了執行此操作的默認行爲,但由於問題只是標記爲SQL,所以我們不知道它是否適用。

0

使用LEFT JOIN來自我加入唯一或使用SELECTGROUP BY作爲子查詢。

相關問題