2010-04-14 5 views
4

J'ai un tableau de données qui a des messages, puis j'ai un tableau de données séparé qui a supprimé les messages. Ce qui se passe lorsqu'un message est supprimé, c'est que son ID est ajouté à la table supprimée plutôt que de supprimer l'entrée de publication.MySQL Select instruction Où table1.id! = Table2.id

Quelle est une façon propre et efficace de sélectionner tous les postes de la table messages sans sélectionner ceux qui ont leur carte d'identité dans le tableau supprimé

Répondre

2

Si vous ne pouvez pas changer vos tables, vous pouvez faire une Left Join (qui rejoindra votre deleted_table si possible), puis vérifiez que id est Null (cela signifie qu'aucune ligne n'a été trouvée).

Select everything_you_need 
From post_table p 
Left Join delete_table d On (d.id = p.id) 
Where d.id Is Null; 

Assurez-vous d'avoir des index sur les deux id -columns pour une meilleure performance.

2

Ne serait-il pas plus facile d'ajouter une colonne supplémentaire à votre table de postes et stocker et valeur booléenne de supprimé? Ou utilisez un champ de type entier (pour représenter l'identifiant de l'utilisateur) si vous voulez stocker qui l'a supprimé, 0 = non supprimé.

+0

Ce serait plus facile, mais c'est pour une infrastructure de tiers que je n'ai pas conçue et je ne peux pas changer la structure de base pour cela. – Michael

1

Si vous avez une bonne raison de ne pas utiliser un drapeau booléen comme bigstylee l'indique, vous pouvez utiliser une sous-requête EXISTS:

SELECT * FROM table1 
    WHERE NOT EXISTS 
    (SELECT * FROM table2 WHERE table1.id=table2.id); 
+1

cela fonctionnera, mais une simple jointure à gauche serait beaucoup plus facile que de faire un sous-select. – oezi

+0

Je ne suis pas d'accord. Cela me semble beaucoup plus clair et lisible, car il indique ce que vous faites. Dans cet exemple simple Mysql optimisera le même .. – Tomas

Questions connexes