INSERT INTO matched_articles
SELECT * FROM articles a LEFT JOIN info i ON a.id = i.article_id WHERE i.tag_id = 5;
INSERT INTO unmatched_articles
SELECT * FROM articles a WHERE a.id NOT IN (SELECT m.id FROM matched_articles m);
Il y a tellement de problèmes ici, je ne sais pas par où commencer. OK dans votre premier insert, vous n'avez pas besoin d'une jointure à gauche, en fait vous n'en avez pas. Il devrait être
INSERT INTO matched_articles
SELECT * FROM articles a INNER JOIN info i ON a.id = i.article_id WHERE i.tag_id = 5;
si vous aviez besoin d'une gauche ADHÉRER vous aurait eu
INSERT INTO matched_articles
SELECT * FROM articles a LEFT JOIN info i ON a.id = i.article_id AND i.tag_id = 5;
Lorsque vous mettez quelque chose du côté droit d'une jointure gauche dans la clause where (autre que la recherche de la valeur nulle valeurs), alors vous le convertissez en jointure interne car il doit remplir cette condition, donc les enregistrements qui n'ont pas de correspondance dans la table de droite sont éliminés.
Maintenant, la deuxième instruction peut être faite avec un cas spécial de la jointure gauche, bien que ce que vous avez fonctionnera.
INSERT INTO matched_articles
SELECT * FROM articles a
LEFT JOIN info i ON a.id = i.article_id AND i.tag_id = 5
WHERE i.tag_id is null
Ceci vous donnera tous les enregistrements qui se trouvent dans la table d'information sauf ceux qui correspondent à la table des articles.
Maintenant, la prochaine chose, vous ne devriez pas écrire des stents d'insertion sans spécifier les champs que vous souhaitez insérer. Vous ne devez jamais écrire une déclaration select en utilisant select *, surtout si vous avez une jointure. C'est généralement codé paresseux, paresseux et devrait être corrigé. Et si quelqu'un changeait la structure de l'une des tables mais pas l'autre? Ce genre de chose est mauvais pour la maintenance et dans le cas d'une déclaration de sélection avec une jointure, elle retourne une colonne deux fois (la colonne de jointure) et c'est une perte de ressources serveur et réseau. Il est juste mauvais codage d'être trop paresseux préciser ce dont vous avez besoin et seulement ce dont vous avez besoin. Alors sortez de l'habitude et ne le faites plus pour aucun code de production.
Si l'emplacement actuel est trop lent, vous pouvez également le fixer avec les bons index. Les champs id sont-ils indexés sur les deux tables? En revanche, s'il y a des millions d'articles, il faudra du temps pour les insérer.Il est souvent préférable de le faire par lots peut-être 50000 à la fois (moins encore si cela prend trop de temps). Il suffit de faire l'insertion dans une boucle qui sélectionne les meilleurs enregistrements XXX, puis les boucles jusqu'à ce que le nombre de lignes affectées soit nul.
Merci beaucoup pour votre aide. Je commence vraiment à travailler avec des bases de données, et vos commentaires ont été très utiles. Votre instruction d'insertion pour les correspondances a bien fonctionné, a été faite en quelques secondes ce qui avait déjà fonctionné pendant des heures avec ma méthode précédente. –