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

MySQL Potřebujete pomoc s definováním SQL pro odstranění nežádoucích řádků

DISTINCT funguje na všech sloupcích v SELECT, takže pokud vyberete vše, vrátí každý samostatný řádek a ne pouze odlišné příspěvky. Chcete-li to obejít, stačí VYBRAT data z tabulky příspěvků a pak je ODLIŠIT, tj.

SELECT DISTINCT posts.*

Ale také jste řekli, že byste chtěli také příspěvky a informace o kočkách, pokud je to možné. Jedním ze způsobů, jak to udělat a zachovat jeden řádek na příspěvek, je použít GROUP_CONCAT takže váš dotaz může skončit nějak takto.

SELECT 
   posts.*,
   GROUP_CONCAT(cats.id SEPARATOR ',') as catsList,
   GROUP_CONCAT(tags.id SEPARATOR ',') as tagsList
FROM posts
INNER JOIN termRelations ON ( posts.id = termRelations.postId )
LEFT JOIN cats ON ( termRelations.termId = cats.id AND termRelations.termTypeId = 1 AND cats.id =5 )
LEFT JOIN tags ON ( termRelations.termId = tags.id AND termRelations.termTypeId = 0 AND 
   (tags.id =2
   OR tags.id =1)
)
GROUP BY posts.id
LIMIT 0 , 30

Ve vašem původním dotazu jsem provedl několik dalších změn, jako je změna prvního spojení na INNER JOIN a přidání filtrů cats/tags do podmínek JOIN pro relevantní tabulky.

ps, když řeknete, že máte samostatné tabulky pro kočky a značky, abyste urychlili generování seznamů, možná zjistíte, že jedna tabulka, která je správně indexována, by byla stejně rychlá a také by zjednodušila váš kód.




  1. Jak zkomprimovat databázi, aby běžela rychleji

  2. Jak se vyhnout upozornění na kódování při vkládání binárních dat do sloupce blob v MySQL pomocí Pythonu 2.7 a MySQLdb

  3. vyberte TOP N řádků z tabulky

  4. PDO selhává s příliš mnoha záznamy, dotazy uložené ve vyrovnávací paměti