Problème :
Joindre deux tables tout en n'en récupérant qu'une seule enregistrement de la table jointe pour chaque enregistrement de la table principale, en particulier dans les contextes où plusieurs enregistrements existent dans la table jointe table.
SOLUTION UTILISANT UNE SOUS-REQUÊTE :
Cette approche contourne efficacement l'erreur qui survient lors de la sélection de plusieurs colonnes dans la table jointe tout en limitant les résultats à un seul enregistrement. La clé consiste à utiliser une sous-requête pour récupérer la clé primaire de l'enregistrement souhaité. La sous-requête est ensuite utilisée pour filtrer la table jointe dans la requête principale.
SELECT c.id, c.title, p.id AS product_id, p.title AS product_title FROM categories AS c JOIN products AS p ON p.id = ( --- the PRIMARY KEY SELECT p1.id FROM products AS p1 WHERE c.id=p1.category_id ORDER BY p1.id LIMIT 1 )
Cette requête démontre des performances supérieures, même lorsque la table jointe contient un nombre d'enregistrements nettement plus important que la table principale.
Approches alternatives :
Bien que l'approche par sous-requête soit généralement optimale, il existe des méthodes alternatives disponibles. Cependant, il est important de considérer leurs implications potentielles en termes de performances.
SELECT id, category_title, (array_agg(product_title))[1] FROM (SELECT c.id, c.title AS category_title, p.id AS product_id, p.title AS product_title FROM categories AS c JOIN products AS p ON c.id = p.category_id ORDER BY c.id ASC) AS a GROUP BY id, category_title;
SELECT c.id, c.title, p.id AS product_id, p.title AS product_title FROM categories AS c CROSS JOIN (SELECT product_id, title, ROW_NUMBER() OVER (PARTITION BY category_id ORDER BY id) AS rn FROM products) AS p WHERE rn = 1;
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!