4

我正在调整脚本的性能,并更改了帖子类别的排序方式。

我成功使用了以下查询。它选择具有 (130|3|4|5) 类别的帖子,并检查它是否也具有 (73) 类别 init,因为一个帖子可以有多个类别。

SELECT * 
FROM   post 
       LEFT JOIN post_plus 
              ON ( post.id = post_plus.news_id ) 
WHERE  category REGEXP '[[:<:]](130|3|4|5)[[:>:]]' 
       AND category REGEXP '[[:<:]](73)[[:>:]]' 
       AND approve = 1 
ORDER  BY fixed DESC, 
          date DESC 
LIMIT  0, 7 

现在有了一个新查询,我需要执行多个 IN (...) 查询而不是AND category REGEXP '...',但由于某种原因,附加AND categoryid IN总是返回空结果。

SELECT *
FROM   post 
       LEFT JOIN post_plus 
              ON ( post.id = post_plus.news_id ) 
       LEFT JOIN post_category 
              ON ( post_category.postid = post.id ) 
WHERE  categoryid IN ( 130, 3, 4, 5 ) 
AND categoryid IN ( 73 )
       AND approve = 1 
ORDER  BY fixed DESC, 
          date DESC 
LIMIT  0, 7; 

post_category 结构

+-----+--------+------------+
| cid | postId | categoryId |
+-----+--------+------------+
| 824 |      7 |         10 |
| 825 |      7 |         13 |
| 826 |      7 |         16 |
| 827 |      7 |         29 |
| 828 |      7 |         71 |
+-----+--------+------------+
4

2 回答 2

4

要获取postid既属于类别73又属于至少一个类别 ID的帖子,130, 3, 4, 5您可以使用

SELECT postid
FROM   post_category
GROUP  BY postid
HAVING MAX(CASE
             WHEN categoryid = 73 THEN 1
           END) = 1
       AND MAX(CASE
                 WHEN categoryid IN ( 130, 3, 4, 5 ) THEN 1
               END) = 1 

这可以在派生表中用于连接到更广泛的查询。

或者另一种可能性是

SELECT c1.postid
FROM   post_category c1
       JOIN post_category c2
         ON c1.postid = c2.postid
WHERE  c1.categoryid IN ( 130, 3, 4, 5 )
       AND c2.categoryid = 73 
于 2013-09-08T01:24:53.977 回答
0

您可以使用INTERSECT-compound 语句:

SELECT postid
FROM post_category
WHERE categoryid = 73
INTERSECT
SELECT postid
FROM post_category
WHERE categoryid IN (130, 3, 4, 5)

这将仅选择那些postid具有categoryid等于73且至少为categoryid= 13034或之一的 s 5

这个查询可能会比聚合GROUP BY查询( sqlite 可以)。如果没有73的 s ,则查询的第二部分永远不会执行,因为空集与其他任何东西的交集始终只是空集。categoryidpostidpostidcategoryid

要获取您的帖子,请使用子查询:

SELECT post.*
FROM post
WHERE post.id IN (SELECT postid
                  FROM post_category
                  WHERE categoryid = 73
                  INTERSECT
                  SELECT postid
                  FROM post_category
                  WHERE categoryid IN (130, 3, 4, 5))

另请注意,您可以根据需要添加更多INTERSECT-compounds。

于 2013-09-08T11:53:03.320 回答