Autor Zpráva
SteveO
Profil *
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 *
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 *
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

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0