2015-01-21 63 views
-2

我有一些麻煩,我的數據庫做下面的查詢:重寫SQL查詢來刪除GROUP BY

SELECT * FROM main_cue 
WHERE group_id IN %s 
GROUP BY group_id 
ORDER BY FIND_IN_SET(group_id, %s) LIMIT 25, 
(ordered_group_ids, ordered_group_ids_as_csv) 

我認爲它與GROUP BY group_id條款做。是否有另一種更有效的方法來執行上述查詢?

+1

您的查詢結果是你的目的? – 2015-01-21 08:54:46

+3

究竟是什麼「有些麻煩」? – navigator 2015-01-21 08:55:06

+1

寫下你的表格結構。 – sandipon 2015-01-21 08:55:15

回答

2

當使用GROUP BY,則SELECT子句只能包含:

  • 列,其也出現在GROUP BY
  • 子句
  • 聚集體,例如COUNT(*)SUM(SomeColumnNotInTheGroupByClause)

不允許在選擇列表,做出現GROUP BY子句中有一列。

要明白這是爲什麼,考慮下面的表:

Foo FooDesc Bar BarDesc 
--- ------- --- ------- 
1 SomeOne 101 John 
1 SomeOne 102 Paul 
2 SomeTwo 201 George 
2 SomeTwo 202 Arnold 

這是無效的:

SELECT Foo, FooDesc, Bar, BarDesc 
FROM Table 
GROUP BY Foo 

,所以是這樣的:

SELECT * 
FROM Table 
GROUP BY Foo 

因爲數據庫引擎無法決定在結果集中採用哪一個Bar(和BarDesc) :

Foo FooDesc Bar 
--- ------- --- 
1 SomeOne 101 or 102 ??? 
2 SomeTwo 201 or 202 ??? 

即使這是非法的,因爲沒有人可以保證FooDesc唯一如下Foo

SELECT Foo, FooDesc 
FROM Table 
GROUP BY Foo 

你必須讓它明確的是FooDesc同樣被複製爲Foo

SELECT Foo, FooDesc 
FROM Table 
GROUP BY Foo, FooDesc 

如果你想有任何其他的列(隨機挑選一個?),比你可能會考慮濫用匯總。

SELECT Foo, FooDesc, MIN(Bar), MIN(BarDesc) 
FROM Table 
GROUP BY Foo, FooDesc 

但是千萬記住,MIN(Bar)MIN(BarDesc)可以從不同的行挑值。

Foo FooDesc Bar BarDesc 
--- ------- --- ------- 
1 SomeOne 101 John 
2 SomeTwo 201 Arnold 
0

上述查詢是否有效? AFAIK,'SELECT *'不能與GROUP BY一起使用。如果你想要所有的行,那麼'GROUP BY'有什麼用?

+1

實際上MySQL確實允許使用'GROUP BY'類型,但它會簡單地返回隨機(「不確定」)結果而不是拋出錯誤。 – 2015-01-21 09:00:41

+0

如果可以這樣做,這是一個壞主意,遵循一般的GROUP BY規則 - 如果指定了GROUP BY子句,SELECT列表中的每個列引用必須標識一個分組列或者是一個set函數的參數。你會安全的! – jarlh 2015-01-21 09:10:54