2010-06-15 223 views
8

在我的數據庫中,我有一個「銷售」表和一個「sales_item」。有時候,出現錯誤,銷售記錄,但不是銷售項目。
所以我試圖從sales_item表中沒有任何行的表「銷售」中獲取salesID。mysql select where count = 0

這裏的MySQL查詢我想會的工作,但它並不:

SELECT s.* 
FROM sales s NATURAL JOIN sales_item si 
WHERE s.date like '" . ((isset($_GET['date'])) ? $_GET['date'] : date("Y-m-d")) . "%' 
AND s.sales_id like '" . ((isset($_GET['shop'])) ? $_GET['shop'] : substr($_COOKIE['shop'], 0, 3)) ."%' 
HAVING count(si.sales_item_id) = 0; 

有什麼想法?

回答

14

表別名v是從哪裏來的? 顯示錶的定義將是一個非常不錯的主意;)

它必須是一個左連接:

SELECT * 
FROM table1 
LEFT JOIN table2 ON(table1.id = table2.table1_id) 
WHERE table2.table1_id IS NULL 

表1是你的銷售表和表2就是你的Sales_item

+0

嗨托比亞斯,別名是一個錯字,我糾正它。 Thx爲您的答案,它完美的作品。 CU左右 – OSdave 2010-06-16 10:54:15

4

你並不需要加入的表,你可以使用類似:

[...] WHERE sales.id NOT IN (SELECT sales_id FROM sales_item) 

這僅僅過濾沒有任何相應的Sales_item項銷售。

+1

由於性能問題,我不會使用「NOT IN」。 Tobias提供的左連接解決方​​案好得多。 – ceteras 2010-06-15 13:01:08

+0

我認爲他將用於臨時調試目的,但你的觀點是完全有效的:) – 2010-06-15 15:05:02

0

假設每個sales_item中的項目具有相關的sales_id,您可能正在查找所有沒有項目的銷售。

如何使用子查詢?獲取所有的sales_ids從銷售表所在的ID不會在項目表中存在...

SELECT * from sales where sales_id not in (SELECT DISTINCT sales_id from sales_item) 

(注:確切的語法可能是錯誤的,但這個想法應該是合理的,如果我理解正確的問題)

4

說完始終與集團使用

GROUP BY si.sales_item_id 
HAVING count(si.sales_item_id) = 0; 
0

中的連接的限制要顯示的行。 我的建議是要忘記加入和使用,而不是像這樣:

SELECT * 銷售 其中salesId沒有(從Sales_item的選擇salesId)

基本上,返回銷售額沒有任何關聯的sales_item。

祝您好運

0

您應該按銷售商品ID對行進行分組。

SELECT s.id, count(*) as no_of_items 
FROM sales s NATURAL JOIN sales_item si 
WHERE s.date like '" . ((isset($_GET['date'])) ? $_GET['date'] : date("Y-m-d")) . "%' 
    AND v.sales_id like '" . ((isset($_GET['shop'])) ? $_GET['shop'] : substr($_COOKIE['shop'], 0, 3)) ."%' 
GROUP BY si.salesitem_id 
HAVING no_of_items = 0; 
1

爲了完整....

SELECT S.* 
FROM SALES S 
WHERE NOT EXISTS (
    SELECT 1 
    FROM SALES_ITEM SI 
    WHERE SI.SALES_ITEM_ID = S.ID) 

MySQL能有問題,在條款。