Mysql
 sql >> база данни >  >> RDS >> Mysql

MySQL Нуждаем се от помощ при дефинирането на SQL за премахване на нежелани редове

DISTINCT работи върху всички колони в SELECT, така че вие ​​избирате всичко, той ще върне всеки отделен ред, а не само отделните публикации. За да заобиколите това, можете просто да ИЗБЕРЕТЕ данните от таблицата с публикации и след това да ги РАЗЛИЧИТЕ, т.е.

SELECT DISTINCT posts.*

Но също така казахте, че бихте искали и информацията за публикациите и котките, ако е възможно. Един от начините да направите това и да запазите един ред на публикация е да използвате GROUP_CONCAT така че вашата заявка може да завърши нещо подобно.

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

Направих няколко други промени в първоначалната ви заявка, като например промяна на първото присъединяване към INNER JOIN и добавяне на филтри за котки/тагове към условията JOIN за съответните таблици.

п.с. когато кажете, че имате отделни таблици за котки и тагове, за да ускорите генерирането на списъци, може да откриете, че една таблица, която е правилно индексирана, ще бъде също толкова бърза и също така ще опрости кода ви.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Най-добрият начин за денормализиране на данни в Django?

  2. Грешка при използване освен в заявка

  3. MySQL JOIN злоупотреба? Колко лошо може да стане?

  4. проверете дали съществува стойност в json кодиращ масив в mysql

  5. PHP - Филтриране по стойност на полето MySQL