sql >> Database >  >> RDS >> Mysql

Mysql - optimalisatie - meerdere group_concat &joins met behulp van hebben

Herschrijf de query om WHERE te gebruiken in plaats van HAVING . Omdat WHERE wordt toegepast wanneer MySQL zoekacties op rijen uitvoert en index kan gebruiken. HAVING wordt toegepast nadat rijen zijn geselecteerd om het reeds geselecteerde resultaat te filteren. HAVING by design kan geen indexen gebruiken.
Je kunt het bijvoorbeeld op deze manier doen:

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

Bijwerken

We voegen elke tabel twee keer toe.
Eerst om te controleren of deze een waarde bevat (voorwaarde van FIND_IN_SET ).
Tweede join levert gegevens op voor GROUP_CONCAT om alle productwaarden uit de tabel te selecteren.

Update 2

Zoals @Matt Raines opmerkte, als we geen lijst met productwaarden nodig hebben met GROUP_CONCAT , zoekopdracht wordt nog eenvoudiger:

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

Hiermee worden alle producten met drie gefilterde kenmerken geselecteerd.



  1. Configuratieparameter work_mem in PostgreSQL op Linux

  2. Een DELETE Pass-Through-query uitvoeren in SQL Server

  3. Polymorfisme in SQL-databasetabellen?

  4. Uitzondering in thread main java.sql.SQLException:Toegang geweigerd voor gebruiker ''@'localhost' (met wachtwoord:NEE)