我有一些麻煩,我的數據庫做下面的查詢:重寫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
條款做。是否有另一種更有效的方法來執行上述查詢?
我有一些麻煩,我的數據庫做下面的查詢:重寫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
條款做。是否有另一種更有效的方法來執行上述查詢?
當使用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
上述查詢是否有效? AFAIK,'SELECT *'不能與GROUP BY一起使用。如果你想要所有的行,那麼'GROUP BY'有什麼用?
實際上MySQL確實允許使用'GROUP BY'類型,但它會簡單地返回隨機(「不確定」)結果而不是拋出錯誤。 – 2015-01-21 09:00:41
如果可以這樣做,這是一個壞主意,遵循一般的GROUP BY規則 - 如果指定了GROUP BY子句,SELECT列表中的每個列引用必須標識一個分組列或者是一個set函數的參數。你會安全的! – jarlh 2015-01-21 09:10:54
您的查詢結果是你的目的? – 2015-01-21 08:54:46
究竟是什麼「有些麻煩」? – navigator 2015-01-21 08:55:06
寫下你的表格結構。 – sandipon 2015-01-21 08:55:15