Autor Zpráva
piiiiiiiip
Profil
Ahoj,
snažím se vytvořit funkci k vyhledávání článků podle tagů. Samotné vyhledávání funguje přesně tak jak má, bohužel se mi k tomu ale nedaří implementovat stránkování.
Problém je v tom že nedokážu spočítat záznamy v db, která obsahují všechny zvolené tagy.

Zde je kod, kterým se snažím o spočítání těch záznamů:
return $this->database->fetchField("
                    SELECT COUNT(*)
                    FROM articles c INNER JOIN article_mapping m ON c.id = m.article_id INNER JOIN article_tags t ON m.tag_id = t.id 
                    HAVING COUNT(CASE WHEN t.tag_title IN ('".$sanitizedTags."') THEN 1 END) = " . count($tags) . "
                ");    
    }
Bohužel tato funkce mi nic nevrátí. Nevíte někdo v čem dělám chybu?
Kajman
Profil
Pro ladění je dobré vypsat si konečný sestavený dotaz i případnou chybovou hlášku. Tady asi dotaz proběhne, ale žádný řádek nevyhoví podmínce having. Pokud se totiž nepoužije group by, agregují se úplně všechny řádky a je jen pár situací, kdy ten count(case) vyjde na všechny kombinace všech článků.

Nejjednoduší bude spočítat počet řádků z poddotazu. Tedy by mělo jít něco jako
SELECT Count(*)
FROM   (SELECT m.article_id
        FROM   article_mapping m
               INNER JOIN article_tags t
                       ON m.tag_id = t.id
        WHERE  t.tag_title IN ('a', 'b', 'c')
        GROUP  BY m.article_id
        HAVING Count(*) = 3) a
piiiiiiiip
Profil
Aha, já to totiš s GROUP BY zkoušel a rovněž mi to vracelo špatný výsledek. Po rychlém otestování to vypadá že vaše řešení funguje.
Děkuji za radu, na ty poddotazy jsem dotet nenarazil. :-)

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