2011-12-16 11 views
9

Mam tabelę pozycji i mam oddzielną tabelę zawierającą indywidualne zakupy każdego elementu. Nie każdy przedmiot został kupiony. Ja wybierając liczbę zakupów i łączenia go z tabelą elementów z oświadczeniem podobny do następującego:Ustawianie domyślnej wartości kolumn NULL od LEWEGO DOŁĄCZENIA i filtrowanie przy użyciu WHERE

SELECT items.name, purchases_count 
FROM `items` 
    LEFT JOIN (SELECT sales.item_name, SUM(unit_sales) AS purchases_count 
     FROM sales GROUP BY item_name) sales ON sales.item_name = items.uid 

Powoduje danych podobnych do:

+------+-----------------+ 
| name | purchases_count | 
|------+-----------------+ 
| Shoe | 12    | 
| Belt | NULL   | 
+------+-----------------+ 

Mój problem pojawia się, gdy chcę, aby filtrować ten wynik na purchases_count. Jeśli używam WHERE purchases_count < 10 lub czegoś podobnego, przedmioty bez rekordu sprzedaży w ogóle (tj. O wartości NULL) są wykluczone z wyszukiwania.

Podjęto próbę użycia COALESCE(purchases_count,0) AS purchases_count, która poprawnie ustawia zapisy NULL na 0, ale nadal nie są wyświetlane podczas korzystania z WHERE. Podejrzewam, że COALESCE dzieje się po WHERE.

Chciałbym móc filtrować na ten numer przy użyciu WHERE i dołączyć wyniki NULL (w postaci zer), jeśli to możliwe. Jakieś sugestie?

+0

'alias' z LEFT JOIN tabeli jest taka sama jak nazwa tabeli, jest to dobra praktyka ?? – diEcho

+0

Zapytanie SQL zostało uproszczone, aby skupić się na pytaniu, rzeczywisty SQL różni się od tego. –

Odpowiedz

7

Aliasy zwykle nie mają zastosowania w klauzuli WHERE - spróbuj COALESCE(purchases_count,0) AS purchases_count_2 z where purchases_count_2 < 10, aby zobaczyć, co mam na myśli.

where COALESCE(purchases_count,0) < 10 powinien działać.

+0

Korzystanie z numbers_count_2 nie zadziała, jest to ten sam problem, co użycie COALESCE na normalnym purchase_count - nie jest rozpoznawany w klauzuli WHERE. 'GDZIE WĘGIEL (purchase_count, 0) <10' działa, ale wolałbym znaleźć sposób, aby nie owijać COALESCE tutaj. Może być teraz najlepszą opcją, dzięki. –

+0

Nie jestem pewien, czy to działa w MySQL, ale możesz użyć podkwerendy: 'wybierz * z (wybierz ... koalescytuj (accounts_count, 0) jako purchase_count ...) where purchases_count_count <10' – wrschneider

1

Jak o:

WHERE (purchases_count < 10) OR (purchases_count IS NULL) 

oczywiście, że nadal pozostanie z wartościami null, ale wciąż można próbować łączyć opcję, aby włączyć te wartości null do zera w celu późniejszego wykorzystania.

+0

Chodzi o to, że chcę być w stanie zastosować dowolne filtry do tych liczb, więc nie chcę, aby zwracano NULL, gdy szukam na przykład customers_count> 6, co w tym przypadku byłoby możliwe. –

0

COALESCE jest prawidłowy sposób, ale nie powinno się używać, GDZIE, spróbuj: -

HAVING purchases_count<=10 
+0

To jest całkowicie nieprawidłowe. HAVING ma zastosowanie tylko podczas korzystania z GROUP BY. – JamieSee

+0

kto tak mówi ????? – ajreal

+1

Standard SQL wymaga, aby HAVING odwoływał się tylko do kolumn w klauzuli GROUP BY lub kolumnach używanych w zagregowanych funkcjach. Jednak MySQL obsługuje rozszerzenie tego zachowania i pozwala HAVING odwoływać się do kolumn na liście SELECT i kolumnach w zewnętrznych podzapytaniach. – ajreal

0

Tak, można dodać gdzie klauzuli tak:

WHERE purchases_count < 10 OR purchases_count is NULL 
0

mają u spróbować tej

SELECT items.name, IFNULL(purchases_count,0) 
FROM `items` 
LEFT JOIN (
      SELECT item_name, SUM(unit_sales) AS purchases_count 
      FROM sales GROUP BY item_name 
      ) s ON s.item_name = items.uid 
GROUP BY items.name 
HAVING purchases_count >10 
+0

To jest całkowicie niepoprawne. HAVING ma zastosowanie tylko podczas korzystania z GROUP BY. – JamieSee

+0

W COALESCE i tak nic tu nie zrobimy, ponieważ nie ma danych NULL dla COALESCE do zera w podzapytaniu na początek. –

+0

patrz "Group BY' w' left join' – diEcho

2

Zamiast zliczać zakupy w osobnym zapytaniu, po prostu zgrupuj zapytanie główne. Aby filtrować na hrabiego, który umieścić w having caluse:

select i.name, coalesce(sum(s.unit_sales), 0) as purchases_count 
from items i 
left join sales s on s.item_name = i.uid 
group by i.name 
having purchases_count < 10 
Powiązane problemy