J'ai deux tableaux.
table_liens
URL Links example.com/1 6 example.com/2 2 example.com/3 4 example.com/4 null
table_pages
URL example.com/2 example.com/4
Comment combiner toutes les URL de manière à conserver le nombre de liens?
Résultat souhaité:
URL Links example.com/1 6 example.com/2 2 example.com/3 4
3 Réponses :
quelque chose comme ceci: (pas sûr à 100% cependant)
SELECT * FROM links_table l LEFT OUTER JOIN pages_table p ON p.url = l.url UNION SELECT * FROM links_table l RIGHT OUTER JOIN pages_table p ON p.url = l.url WHERE l.url IS NULL;
SELECT url, liens FROM links_table UNION (SELECT url, null FROM pages_table MOINS SELECT url, liens FROM links_table) ceci?
SELECT * FROM liens_table l GAUCHE OUTER JOIN pages_table p ON p.url = l.url UNION SELECT * FROM liens liens l DROIT OUTER JOIN pages_table p ON p.url = l.url O l.url EST NULL;
Dans MySQL, vous pouvez émuler une jointure complète
avec UNION ALL
et une agrégation:
select url, max(links) links from ( select url, links from links_table union all select url, null from pages_table ) t group by url
Parfait, cela semble fonctionner. Je souhaite que MySQL ait une fonction native FULL JOIN
.
@ Pikamander2: oui, malheureusement cela ne fait pas partie de la syntaxe MySQL, comme pour la jointure latérale
(aka cross apply
) ...
Vous semblez vouloir renvoyer toutes les lignes de links_table
plus les lignes supplémentaires de pages_table
qui ne sont pas dans cette table. J'utiliserais simplement union all
:
select l.url, l.links from links_table l union all select p.url, null from pages_table p where not exists (select 1 from links_table where l.url = p.url);