2013-04-24 80 views
0
SELECT o.Date1, o.Date2 
FROM customers AS c, products AS p, products_ids AS pi, orders AS o, temptable AS te 
WHERE p.productid = pi.productidD 
AND pi.prodno = te.prodno 
AND c.custid = o.custid 
AND o.custid = te.custid 
AND te.custid = '24' 
GROUP BY pi.productiD 

查詢結果每次返回所有行的同一日期(即使日期在mysql內部不同)。我的查詢返回每次相同(日期2)

+0

。 。你需要學習正確的連接語法。一旦用'join'編寫它,你就不會有意想不到的笛卡爾產品的問題。 – 2013-04-24 22:01:06

+0

Pleeease任何人? – marina 2013-04-24 22:05:49

+0

@marina你看不到戈登的評論? – 2013-04-24 22:06:48

回答

1

如已提到的它是值得切換到新的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.Date1o.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; 

所以,雖然我還沒有真正回答我希望你的問題已經顯示你出錯的地方。你真的需要確定你正在努力實現的團隊,如果你還沒有找到解決方案,那麼我會建議一個新的,更有建設性的問題,提供樣本數據和預期的輸出,並且有明確的規則爲什麼預計產出會被驅逐。

+0

非常感謝所有這些!我很感激! – marina 2013-04-24 22:37:51

+0

+1。 。 。絕對值得讚賞。 – 2013-04-25 13:10:35