2010-06-04 5 views
3

Fondamentalement, j'ai une table principale (comptes) et une table méta (accounts_meta) ... Le tableau méta ressemble à ceci:Comment sélectionner les lignes qui n'ont pas de valeur dans une seconde table

id | account_id | meta_key | meta_value 

ce que je veux faire est que certains comptes qui ne sont pas « referrer_paid » comme une ligne dans la table accounts_meta ...

Voici mon code jusqu'à présent ...

SELECT a.* FROM accounts AS a 
    LEFT JOIN accounts_meta AS am ON a.id = am.account_id AND am.meta_key != 'referrer_paid' 
    WHERE a.account_referrer != '' 
    GROUP BY a.id 

Espérons que je fais sens. Qu'est-ce que je fais mal?

Répondre

4

petit changement de @lexu:

 
SELECT * 
    FROM accounts 
WHERE id NOT IN (select account_id 
        from `account_meta_table` 
        where meta_key = 'referrer_paid' 
       ); 
+0

Merci lexu et didxga :) Avoir méta_key = 'referrer_paid' a fonctionné à la place de la meta_key! = 'Referrer_paid'. Merci à vous deux! –

0

SELECT a. * Des comptes en tant que LEFT JOIN accounts_meta mod SUR a.id = am.account_id ET am.meta_key! = 'Referrer_paid' OÙ ISNULL (am.account_referrer) GROUP BY a.id

+0

vous voulez vérifier ISNULL (am.account_id) dans laquelle clause à la place. –

+0

oui, merci pour les heads up – bogdanvursu

4
SELECT * 
    FROM accounts 
WHERE id NOT IN (select DISTINCT account_id 
        from `account_meta_table` 
        where meta_key != 'referrer_paid' 
       ); 
+0

+1 pour éviter la jointure à gauche! – lexu

+0

thanx @lexu pour une indentation correcte. – Salil

+3

La jointure à gauche est plus rapide que la sous-requête dans mysql. Peut-être pas tellement de différence dans le futur quand ils améliorent l'optimiseur (ver 6+). –

2
SELECT a.* FROM accounts AS a 
LEFT JOIN accounts_meta AS am ON a.id = am.account_id AND am.meta_key = 'referrer_paid' 
WHERE a.account_referrer != '' 
    AND am.account_id IS NULL 

vous ne avez pas besoin groupe en tant que gauche-join-est nul ne produisent pas les lignes de compte en double

EDIT: duh, changé am.meta_key != 'referrer_paid'-am.meta_key = 'referrer_paid'

C'est ce que vous vouliez. Il retourne NULL pour la ligne jointe si elle ne marche pas correspondance et vous prenez uniquement les lignes NULL

Questions connexes