Mysql
 sql >> база данни >  >> RDS >> Mysql

Mysql - оптимизация - множество group_concat &присъединявания, използващи като

Пренапишете заявката, за да използвате WHERE вместо HAVING . Защото WHERE се прилага, когато MySQL извършва търсене на редове и може да използва индекс. HAVING се прилага, след като са избрани редове, за да филтрира вече избран резултат. HAVING по дизайн не може да използва индекси.
Можете да го направите например по този начин:

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

Актуализация

Свързваме всяка таблица два пъти.
Първо проверяваме дали съдържа някаква стойност (условие от FIND_IN_SET ).
Второто присъединяване ще произведе данни за GROUP_CONCAT за да изберете всички стойности на продукта от таблицата.

Актуализация 2

Както коментира @Matt Raines, ако не се нуждаем от продуктови стойности на списък с GROUP_CONCAT , заявката става още по-проста:

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

Това ще избере всички продукти с три филтрирани атрибута.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Как да съпоставим нежелани знаци в базата данни на mysql с арабски букви с PHP и MYSQL

  2. Как да избягате от специалните символи на mysql с sockets.io/node.js/javascript

  3. Защо innodb SHOW TABLE STATUS е толкова ненадежден?

  4. Изберете последните N реда от MySQL

  5. JSON_VALUE() в MySQL