0

我想获取具有某些多个标签的帖子的 post_ID 和缩略图。我的表格如下:

table: post
-------------------
post_ID | thumbnail
1       | 1.jpg
2       | 2.jpg
3       | 3.jpg
4       | 4.jpg
5       | 5.jpg

table: tags
-----------
tag_ID | tag
1      | red
2      | yellow
3      | orange
4      | blue
5      | pink

table: post_tags
----------------
post_ID | tag_ID
1       | 1
1       | 2
1       | 4
1       | 5
2       | 2
2       | 3
3       | 4
3       | 1
3       | 2
4       | 5
4       | 4
5       | 1
5       | 3
5       | 5

我目前使用这样的东西,但它不起作用:我首先将帖子的所有标签放在一个数组中,然后比较它们以查找帖子是否包含所有提到的 3 个标签。

 SELECT post_ID FROM post_tags 
 WHERE tag_ID IN ($thisTags[0], $thisTags[1], $thisTags[2], $thisTags[3])

我需要加入或组或什么?我是 SQL 和 PHP 的新手。非常感谢。

4

3 回答 3

0

你在寻找这样的东西吗?

SELECT post_ID 
  FROM post_tags 
 WHERE tag_ID IN (1, 2) -- IN($thisTags[0], $thisTags[1], $thisTags[2], $thisTags[3])
 GROUP BY post_ID
 HAVING COUNT(DISTINCT tag_ID) = 2 -- COUNT(DISTINCT tag_ID) = 4

这是SQLFiddle演示

HAVING COUNT(DISTINCT tag_ID) = 2确保结果集仅包含post_ID同时具有tag_ID值​​ 1 和 2 的那些。

于 2013-07-17T21:17:38.380 回答
0

如果您对 post_tags(post_ID,tag_ID) 有一个 UNIQUE 约束,并且您可以验证 thisTags 的元素是唯一的,那么您可以执行以下操作:

SELECT post_ID FROM post_tags 
 WHERE tag_ID IN ($thisTags[0], $thisTags[1], $thisTags[2], $thisTags[3])
 GROUP BY post_ID
HAVING COUNT(1) = 4

这种方法要求其中的元素$thisTags是唯一的。您可以轻松解决 post_tags 表中的唯一性问题(但上面的查询也要求它是唯一的。)

还有其他 SQL 语句,其他方法,可以达到等效的结果,但上面的查询是最简洁的。(其他一些方法是使用 EXISTS 谓词,或对每个标签返回的 post_ID 集使用 JOIN 操作。)

于 2013-07-17T21:21:06.850 回答
0

这是“set-within-sets”子查询的一个示例。我建议使用group byandhaving以获得最大的灵活性。这个想法是将逻辑移动到having子句中。在您的情况下,这看起来像:

SELECT post_ID
FROM post_tags 
group by post_id
having sum(tag_id = $thisTags[0]) > 0 and
       sum(tag_id = $thisTags[1]) > 0 and
       sum(tag_id = $thisTags[2]) > 0 and
       sum(tag_id = $thisTags[3]) > 0;

如果您想要这些标签而不想要其他标签:

SELECT post_ID
FROM post_tags 
group by post_id
having sum(tag_id = $thisTags[0]) > 0 and
       sum(tag_id = $thisTags[1]) > 0 and
       sum(tag_id = $thisTags[2]) > 0 and
       sum(tag_id = $thisTags[3]) > 0 and
       count(distinct tag_id) = 4;

如果您想要这四个标签中的至少三个:

SELECT post_ID
FROM post_tags 
group by post_id
having (max(tag_id = $thisTags[0]) + and
        max(tag_id = $thisTags[1]) + and
        max(tag_id = $thisTags[2]) + and
        max(tag_id = $thisTags[3])
       ) >= 3;
于 2013-07-17T21:26:16.487 回答