SELECT
*
FROM
article table1
LEFT JOIN pintag table2 ON table2.artId = table1.id
WHERE
table2.tagId IN (1, 3)
GROUP BY
table1.id
HAVING
COUNT(
DISTINCT table1.id,
table2.tagId
) = 2
SELECT
DISTINCT table1.*
FROM
article table1
LEFT JOIN pintag table2 ON table2.artId = table1.id
LEFT JOIN pintag table3 ON table3.artId = table1.id
WHERE table2.tagId =1
AND table3.tagId =3
有两种方式,第一种是利用count,如果一篇文章包含A,B,D三个标签,那么pintag中指向该文章且标签为A或B或D的记录数一定是三条「这里可能需要去重」。下面就是利用这种方式实现的语句,只需要修改in后面括号内的内容和count=后面的数字即可。
第二种方式就是有多少个标签就join多少张表,虽然效率比较坑,而且拼接起来比较麻烦。但是胜在简单,如果只是临时用用而且对性能无要求,可以用这种方式将就。
这种基于标签的查询用关系型数据库会非常蛋疼,不论怎么处理性能都不会太好。如果对遇到对性能要求比较高的场景,建议用
redis对多个标签进行and操作进行查询。比如: