2010-06-15 14 views
8

W moim db, mam "sprzedaży" tabeli i "sales_item". Czasami coś idzie nie tak, a sprzedaż jest rejestrowana, ale nie sprzedaż.
Tak więc próbuję uzyskać salesID z mojej tabeli "sprzedaży", które nie mają żadnych wierszy w tabeli sales_item.mysql wybierz gdzie liczyć = 0

Oto zapytanie mysql myślałem, że działa, ale nie:

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; 

Wszelkie myśli?

Odpowiedz

14

Skąd pochodzi alias tabeli v? Pokazuje definicję tabeli byłby naprawdę dobry pomysł;)

To musi być po lewej przyłączyć:

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

Tabela1 to sprzedaż-Table i Tabela 2 to ty sales_item

+0

hi tobias, alias v był literówką, poprawiłem go. Thx za odpowiedź, działa idealnie. CU wokół – OSdave

4

Nie trzeba dołączyć tabele, można użyć coś takiego:

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

filtruje tylko sprzedaży, które nie mają żadnych odpowiednie wpisy sales_item.

+1

Nie użyłbym "NOT IN" ze względu na obawy dotyczące wydajności. Lewe rozwiązanie łączenia dostarczone przez Tobiasza jest o wiele lepsze. – ceteras

+0

Myślę, że będzie on używał tego do tymczasowych celów debugowania, ale twój punkt jest całkowicie ważny :) –

0

Zakładając, że każdy pozycja w sales_item ma powiązany sales_id przeciwko niemu, prawdopodobnie szukasz całej sprzedaży, która nie ma pozycji.

Co powiesz na używanie podzapytania? Uzyskać wszystkie sales_ids z tabeli sprzedaży, gdzie id nie istnieje w tabeli elementów ...

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

(uwaga: Dokładna składnia może być źle, ale idea powinny być mocne, jeśli dobrze zrozumiałem pytanie poprawnie)

4

Mając zawsze używany z grupy Przez

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

Dołącz ogranicza wiersze mają być wyświetlane. Moja rada jest, aby zapomnieć o łączeniu i używać zamiast coś takiego:

select * ze sprzedaży gdzie salesId nie w (wybierz salesId z sales_item)

Zasadniczo zwraca sprzedaży, które nie ma żadnych powiązany sales_item.

Powodzenia

0

Powinieneś prawdopodobnie grupować wiersze według identyfikatora przedmiotu sprzedaży.

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

Dla kompletności ....

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

MySQL może mieć problemy z klauzul.