Autor | Zpráva | ||
---|---|---|---|
SteveO Profil * |
#1 · Zasláno: 3. 10. 2017, 12:37:27
Zdravím, bojuji se SQL dotazem. Celé toto je dílčí část hlavního dotazu:
( SELECT GROUP_CONCAT(DISTINCT CONCAT(aad.name, ': ', GROUP_CONCAT(apa.text)) ORDER BY aca.sort_order ASC SEPARATOR '|') FROM " . DB_PREFIX . "product_attribute apa LEFT JOIN " . DB_PREFIX . "attribute_description aad ON apa.attribute_id = aad.attribute_id LEFT JOIN " . DB_PREFIX . "category_attribute aca ON apa.attribute_id = aca.attribute_id WHERE aca.category_id = ( SELECT ap2c.category_id FROM " . DB_PREFIX . "product_to_category ap2c LEFT JOIN " . DB_PREFIX . "category_path acp ON ap2c.category_id = acp.category_id LEFT JOIN " . DB_PREFIX . "category_attribute aca_2 ON aca_2.category_id = ap2c.category_id WHERE ap2c.product_id = p.product_id AND aca_2.attribute_id IS NOT NULL ORDER BY acp.level DESC LIMIT 1 ) AND apa.product_id = p.product_id AND aad.language_id = '" . (int)$this->config->get('config_language_id') . "' AND TRIM(apa.text) != '' GROUP BY apa.atrribute_id, aca.category_id ) AS katparam Dotaz funguje, když je tam místo GROUP_CONCAT(apa.text) jen apa.text
a místo GROUP BY apa.atrribute_id, aca.category_id jen GROUP BY aca.category_id .
Ty dva GROUP_CONCATY v sobě už jsou ale zřejmě blbost. Když to upravím na: ( SELECT GROUP_CONCAT(DISTINCT name_text ORDER BY aca.sort_order ASC SEPARATOR '|') FROM ( SELECT aca.category_id, aca.sort_order, CONCAT(aad.name, ': ', GROUP_CONCAT(apa.text)) AS name_text FROM " . DB_PREFIX . "product_attribute apa LEFT JOIN " . DB_PREFIX . "attribute_description aad ON apa.attribute_id = aad.attribute_id LEFT JOIN " . DB_PREFIX . "category_attribute aca ON apa.attribute_id = aca.attribute_id WHERE aca.category_id = ( SELECT ap2c.category_id FROM " . DB_PREFIX . "product_to_category ap2c LEFT JOIN " . DB_PREFIX . "category_path acp ON ap2c.category_id = acp.category_id LEFT JOIN " . DB_PREFIX . "category_attribute aca_2 ON aca_2.category_id = ap2c.category_id WHERE ap2c.product_id = p.product_id AND aca_2.attribute_id IS NOT NULL ORDER BY acp.level DESC LIMIT 1 ) AND apa.product_id = p.product_id AND aad.language_id = '" . (int)$this->config->get('config_language_id') . "' AND TRIM(apa.text) != '' GROUP BY apa.attribute_id ) AS katparam2 GROUP BY aca.category_id ) AS katparam Dostanu chybu "Unknown column 'p.product_id' in 'where clause'. Sloupec p.product_id se získává v hlavním dotazu, mimo uvedené. Poradí prosím někdo? Díky moc. |
||
TomášK. Profil * |
#2 · Zasláno: 3. 10. 2017, 14:37:25
Ty dva GROUP_CONCATY v sobě už jsou ale zřejmě blbost.
Jsou. Ten druhý dotaz vypadá jako správná cesta. Našel jsem několik odkazů, podle kterých MySQL umožňuje odkazovat se jen o jedno patro výš v korelovaných poddotazech, např. Object moved. Všechny jsou staršího data. Zkusil jsem jednoduchý dotaz v současné MariaDB a ten mi prošel. Je možné přidat product_id do GROUP BY a filtrovat podle něj až při napojedni katparam. |
||
SteveO Profil * |
#3 · Zasláno: 3. 10. 2017, 15:12:00
Díky za odpověď. Doplácal jsem se k tomuto řešení, sice funguje, ale je ukrutně pomalé. Asi bude nejrozumnější ten jeden GROUP_CONCAT oželet a prostě si uspořádat výsledky PHPkem...
( SELECT GROUP_CONCAT(DISTINCT name_text ORDER BY attr_sort_order ASC SEPARATOR '|') FROM ( SELECT aca.category_id AS attr_category_id, aca.sort_order AS attr_sort_order, apa.product_id AS attr_product_id, CONCAT(aad.name, ': ', GROUP_CONCAT(DISTINCT apa.text ORDER BY CAST(apa.text AS DECIMAL(20,3)) SEPARATOR ', ')) AS name_text FROM " . DB_PREFIX . "product_attribute apa LEFT JOIN " . DB_PREFIX . "attribute_description aad ON apa.attribute_id = aad.attribute_id LEFT JOIN " . DB_PREFIX . "category_attribute aca ON apa.attribute_id = aca.attribute_id WHERE aca.category_id = ( SELECT ap2c.category_id FROM " . DB_PREFIX . "product_to_category ap2c LEFT JOIN " . DB_PREFIX . "category_path acp ON ap2c.category_id = acp.category_id LEFT JOIN " . DB_PREFIX . "category_attribute aca_2 ON aca_2.category_id = ap2c.category_id WHERE aca_2.attribute_id IS NOT NULL GROUP BY ap2c.product_id ORDER BY acp.level DESC LIMIT 1 ) AND aad.language_id = '" . (int)$this->config->get('config_language_id') . "' AND TRIM(apa.text) != '' GROUP BY apa.attribute_id, apa.product_id ) AS katparam2 WHERE attr_product_id = p.product_id GROUP BY attr_category_id ) AS katparam |
||
Časová prodleva: 7 let
|
0