Mysql
 sql >> Base de données >  >> RDS >> Mysql

Mysql - optimisation - plusieurs group_concat &joins using having

Réécrire la requête pour utiliser WHERE au lieu de HAVING . Parce que WHERE est appliqué lorsque MySQL effectue une recherche sur les lignes et peut utiliser index. HAVING est appliqué après la sélection des lignes pour filtrer le résultat déjà sélectionné. HAVING de par sa conception ne peut pas utiliser d'index.
Vous pouvez le faire, par exemple, de cette façon :

SELECT p.id, p.name, p.default_image_id, 
    GROUP_CONCAT( DISTINCT pc.colour_id ) AS product_colours, 
    GROUP_CONCAT( DISTINCT pt.tag_id ) AS product_tags, 
    GROUP_CONCAT( DISTINCT ps.tag_id ) AS product_sizes
FROM shop_products p
    JOIN shop_product_to_colours pc_test ON p.id = pc_test.product_id AND pc_test.colour_id = 18
    JOIN shop_products_to_tag pt_test ON p.id = pt_test.product_id AND pt_test.tag_id = 1
    JOIN shop_product_colour_to_sizes ps_test ON p.id = ps_test.product_id AND ps_test.tag_id = 17
    JOIN shop_product_to_colours pc ON p.id = pc.product_id
    JOIN shop_products_to_tag pt ON p.id = pt.product_id
    JOIN shop_product_colour_to_sizes ps ON p.id = ps.product_id
WHERE p.category_id =  '50'
GROUP BY p.id
ORDER BY p.name ASC

Mettre à jour

Nous joignons chaque table deux fois.
D'abord pour vérifier si elle contient une valeur (condition de FIND_IN_SET ).
La seconde jointure produira des données pour GROUP_CONCAT pour sélectionner toutes les valeurs de produit du tableau.

Mise à jour 2

Comme @Matt Raines l'a commenté, si nous n'avons pas besoin de lister les valeurs de produit avec GROUP_CONCAT , la requête devient encore plus simple :

SELECT p.id, p.name, p.default_image_id
FROM shop_products p
    JOIN shop_product_to_colours pc ON p.id = pc.product_id
    JOIN shop_products_to_tag pt ON p.id = pt.product_id
    JOIN shop_product_colour_to_sizes ps ON p.id = ps.product_id
WHERE p.category_id =  '50'
    AND (pc.colour_id = 18 AND pt.tag_id = 1 AND ps.tag_id = 17)
GROUP BY p.id
ORDER BY p.name ASC

Cela sélectionnera tous les produits avec trois attributs filtrés.