sql >> Databáze >  >> RDS >> Mysql

Obejít limit 61 JOIN tabulky v MySQL vnořením poddotazů do sebe

Máte pravdu, že spojení příliš mnoha atributů prostřednictvím návrhu EAV pravděpodobně překročí limit spojení. Ještě před tím pravděpodobně existuje praktický limit spojení, protože náklady na tolik spojení jsou geometricky vyšší a vyšší. Jak špatné to je, závisí na kapacitě vašeho serveru, ale pravděpodobně bude o něco nižší než 61.

Dotazování datového modelu EAV za účelem vytvoření výsledku, jako by byl uložen v konvenčním relačním modelu (jeden sloupec na atribut), je tedy problematické.

Řešení:Nedělejte to se spojením na atribut, což znamená, že nemůžete očekávat, že výsledek vytvoříte v konvenčním formátu typu řádek na entitu čistě s SQL.

Schéma Magento důvěrně neznám, ale z vašeho dotazu mohu usoudit, že by něco takového mohlo fungovat:

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,...) predikát je místo, kde zadáváte více atributů. Pro získání více atributů není potřeba přidávat další spojení. Jsou jednoduše vráceny jako řádky, nikoli sloupce.

To znamená, že musíte napsat kód aplikace, abyste načetli všechny řádky této sady výsledků a namapovali je do polí jednoho objektu.

Z komentářů od @Axel zní, že Magento poskytuje pomocné funkce, které spotřebovávají sadu výsledků a mapují ji na objekt.




  1. 4 způsoby, jak zkontrolovat datový typ sloupce v MySQL

  2. Jak skrýt dekoraci sady výsledků ve výstupu Psql

  3. Spravujte MySQL pomocí phpMyAdmin na Debianu 5 (Lenny)

  4. Základní tabulka auditu Oracle Trigger