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

Заобиколете ограничението от 61 таблици JOIN в MySQL чрез вмъкване на подзаявки една в друга

Прав сте, че свързването на твърде много атрибути чрез дизайн на EAV вероятно ще надхвърли лимита за присъединяване. Дори преди това вероятно има практически ограничение на съединенията, защото цената на толкова много съединения става все по-висока и по-висока геометрично. Колко лошо е това зависи от капацитета на сървъра ви, но е вероятно той да е доста по-нисък от 61.

Така че запитването на модел на данни на EAV за получаване на резултат, сякаш е съхранен в конвенционален релационен модел (една колона на атрибут) е проблематично.

Решение:не го правете с присъединяване на атрибут, което означава, че не можете да очаквате резултатът да бъде произведен в конвенционален формат ред на обект само с SQL.

Не съм запознат отблизо със схемата на Magento, но мога да заключа от вашето запитване, че нещо подобно може да работи:

SELECT cpe.entity_id
, o.value AS option
, v.value AS option_value
FROM catalog_product_entity AS cpe
INNER JOIN catalog_product_entity_int AS i 
  ON cpe.entity_id = i.entity_id AND i.attribute_id IN (2,3,4)
INNER JOIN eav_attribute_option AS o 
  ON i.value = o.option_id AND i.attribute_id = o.attribute_id
INNER JOIN eav_attribute_option_value AS v
  ON v.option_id = o.option_id;

IN(2,3,4,...) предикат е мястото, където задавате множество атрибути. Няма нужда да добавяте още обединения, за да получите повече атрибути. Те просто се връщат като редове, а не като колони.

Това означава, че трябва да напишете код на приложението, за да извлечете всички редове от този набор от резултати и да ги съпоставите в полета на един обект.

От коментари на @Axel звучи, че Magento предоставя помощни функции, за да направи това, като консумира набор от резултати и го преобразува в обект.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Поддръжка за ограничаване на външния ключ в Rails

  2. Посочване на конкретни полета със Sequelize (NodeJS) вместо *

  3. Преобразуване на MySQL код в Access:GROUP_CONCAT и троен JOIN

  4. MySQL заявката връща дублиращи се редове

  5. MySQL:Достъпът е отказан за потребител 'user'@'IP_ADDRESS' - Разрешен отдалечен достъп за някои хостове е неуспешен за други хостове