如已提到的它是值得切換到新的ANSI 92 JOIN語法清晰,這樣可以避免意外的交叉連接,使您的查詢就會變成:
SELECT o.Date1, o.Date2
FROM customers AS c
INNER JOIN orders AS o
ON c.custid = o.custid
INNER JOIN temptable AS te
o.custid = te.custid
INNER JOIN products AS p
ON pi.prodno = te.prodno
INNER JOIN products_ids AS pi
ON p.productid = pi.productidD
WHERE te.custid = '24'
GROUP BY pi.productiD;
然而,這不是問題您的查詢,問題是您正在濫用MySql中的功能,因此您可以通過以下方式選擇不屬於該組的部分的項目:
此處您告訴查詢爲pi.ProductID
選擇每行不同值的行,對於o.Date1
和o.Date2
可能有多個不同的值每個pi.ProductID
,並且您給這個查詢沒有提示這些多種可能性中的哪一種可供選擇。
使用select中不在組中的列是ANSI標準允許的,但只有當select中的列在功能上依賴於group by中的列時,這很難堅持如此多數DBMS不允許選擇中不在組中的列。
爲了證明考慮這個數據集(T)
OrderID ProductID Date1 Date2
1 1 20130401 20130402
2 1 20130402 20130403
3 2 20130403 20130404
4 2 20130404 20130405
5 2 20130405 20130406
如果(在你的情況下),你做的事:
SELECT OrderID, ProductID, Date1, Date2
FROM T
GROUP BY ProductID
你可能會得到:
OrderID ProductID Date1 Date2
1 1 20130401 20130402
3 2 20130403 20130404
只是走每個產品ID的第一行,但由於查詢是非確定性的,因此查詢將返回同樣正確甕最後一排的每個產品編號:
OrderID ProductID Date1 Date2
2 1 20130402 20130403
5 2 20130405 20130406
它是一種常見的神話,通過增加訂單將有助於這一點,例如
SELECT OrderID, ProductID, Date1, Date2
FROM T
GROUP BY ProductID
ORDER BY OrderID;
MySQL的確定的行通過施加的順序,因此,即使添加ORDER BY OrderID
不保證所述第一順序返回每個之前的productID被返回。
的MySQL Docs狀態
該服務器是可以自由選擇從每個組中的任何值,所以,除非它們是相同的,所選擇的值是不確定的。此外,每個組的值的選擇不能通過添加ORDER BY子句來影響。
最後闡述我說過函數依賴列,因爲在這個數據集OrderID
是主鍵,根據ANSI標準,你可以寫:
SELECT OrderID, ProductID, Date1, Date2
FROM T
GROUP BY OrderID;
所以,雖然我還沒有真正回答我希望你的問題已經顯示你出錯的地方。你真的需要確定你正在努力實現的團隊,如果你還沒有找到解決方案,那麼我會建議一個新的,更有建設性的問題,提供樣本數據和預期的輸出,並且有明確的規則爲什麼預計產出會被驅逐。
。 。你需要學習正確的連接語法。一旦用'join'編寫它,你就不會有意想不到的笛卡爾產品的問題。 – 2013-04-24 22:01:06
Pleeease任何人? – marina 2013-04-24 22:05:49
@marina你看不到戈登的評論? – 2013-04-24 22:06:48