2010-06-15 5 views
8

Dans ma base de données, j'ai une table "sales" et une "sales_item". Parfois, quelque chose ne va pas et la vente est enregistrée mais pas l'article de vente.
Donc j'essaye d'obtenir le salesID de ma table "ventes" qui n'ont aucune ligne dans la table sales_item.mysql select where count = 0

Voici la requête MySQL Je pensais que cela fonctionnerait, mais il ne fait pas:

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; 

Toute pensée?

Répondre

14

D'où vient l'alias de table v? Afficher la définition de table serait une très bonne idée;)

Il doit être une jointure gauche:

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

Tableau 1 est votre chiffre d'affaires Table et table2 est vous sales_item

+0

salut tobias, l'alias v était une faute de frappe, je l'ai corrigé. Merci pour votre réponse, cela fonctionne parfaitement. CU autour de – OSdave

4

Vous n'avez pas besoin de joindre les tables, vous pouvez utiliser quelque chose comme:

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

Ce ne filtre que les ventes qui n'ont pas toutes les entrées de sales_item correspondantes.

+1

Je n'utiliserais pas "NOT IN" en raison de problèmes de performances. La solution de jointure gauche fournie par Tobias est beaucoup mieux. – ceteras

+0

Je pense qu'il l'utilisera à des fins de débogage temporaire, mais votre point de vue est parfaitement valide :) –

0

En supposant que chaque article dans sales_item a un sales_id associé contre lui, vous êtes probablement à la recherche de toutes les ventes qui n'ont pas d'articles.

Comment utiliser une sous-requête? Obtenez tous les sales_ids de la table de vente où l'identifiant n'existe pas dans le tableau des articles ...

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

(Note: La syntaxe exacte peut-être tort, mais l'idée doit être saine, si je comprends bien la question)

4

Ayant toujours utilisé avec Grouper par

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

La jointure est de restreindre les lignes à afficher. Mon conseil est d'oublier la jointure et d'utiliser plutôt quelque chose comme ceci:

select * des ventes où salesId pas (sélectionnez salesId de sales_item)

Fondamentalement, retourne les ventes qui n'a pas de sales_item associé.

Bonne chance

0

Vous devez probablement grouper les lignes par numéro d'article de vente.

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

Pour être complet ....

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

MySQL peut avoir des problèmes avec les clauses IN.