2013-01-10 50 views
0

我有一个非常奇怪的问题。wordpress中的简单SQL查询问题

我只是想选择所有在两个给定类别中的功能。

我的继承人SQL:

SELECT wp_posts.ID 
FROM wp_posts 
INNER JOIN wp_term_relationships ON wp_posts.ID = wp_term_relationships.object_id 
WHERE wp_term_relationships.term_taxonomy_id = 83 
    AND wp_term_relationships.term_taxonomy_id = 84 

这应返回一个结果,但它不返回任何东西。

如果我注释掉:

*wp_term_relationships.term_taxonomy_id = 83* 

的后即时寻找返回。

如果我注释掉:

*wp_term_relationships.term_taxonomy_id = 84* 

再次返回岗位。

为什么然后,当这两个条件都包含在内时,什么都不会返回?

任何帮助将是appreciated.Thanks

回答

1

如果你想返回有两个与之相关联的term_taxonomy_id的所有帖子你可以使用:

SELECT p.ID 
FROM wp_posts p 
INNER JOIN wp_term_relationships r 
    ON p.ID = r.object_id 
WHERE r.term_taxonomy_id IN (83, 84) 
GROUP BY p.ID 
HAVING count(distinct r.term_taxonomy_id) =2 

这将返回所有既有分类术语的记录。

您的查询不起作用,因为term_taxonomy_id不能同时有两个值。您可以更改查询以使用OR而不是AND,或者您可以使用我提供的版本。

2

wp_term_relationships.term_taxonomy_id不能在同一时间=83=84

试试这个:

SELECT 
    wp_posts.ID 
FROM wp_posts 
INNER JOIN wp_term_relationships ON wp_posts.ID = wp_term_relationships.object_id 
WHERE wp_term_relationships.term_taxonomy_id IN (83 , 48); 

OR

... 
WHERE wp_term_relationships.term_taxonomy_id = 83 
    OR wp_term_relationships.term_taxonomy_id = 84; 

但是,我认为你正在寻找那些在同一时间都term_taxonomy_id“IDS 83,84职位,并在此如果您正在寻找relation division;这里是这样做的一个办法:

SELECT 
    wp_posts.ID 
FROM wp_posts 
INNER JOIN 
(
    SELECT * 
    FROM wp_term_relationships 
    WHERE object_id IN (SELECT object_id 
         FROM wp_term_relationships 
         WHERE term_taxonomy_id IN (83 , 48); 
         GROUP BY objecT_id 
         HAVING COUNT(term_taxonomy_id) = 2) 
) t ON wp_posts.ID = t.object_id; 

或者:直接,没有JOIN。像这样:

SELECT 
    wp_posts.ID 
FROM wp_posts 
WHERE ID IN 
(
    SELECT object_id 
    FROM wp_term_relationships 
    WHERE term_taxonomy_id IN (83 , 48); 
    GROUP BY objecT_id 
    HAVING COUNT(term_taxonomy_id) = 2 
); 
+0

感谢您的回复。这对我来说不起作用,因为我需要返回两个类别中都有的所有帖子。使用IN(83,84)将返回可能只在一个类别中发布的帖子 – richelliot

+0

@richelliot查看我的编辑。 –

0

如果你想要的结果表明,在这两个类别的职位,你需要得到两个结果并加以比较:

SELECT a.ID 
FROM (
     SELECT wp_posts.ID 
     FROM wp_posts 
     INNER JOIN wp_term_relationships ON wp_posts.ID = wp_term_relationships.object_id 
     WHERE wp_term_relationships.term_taxonomy_id = 83 
     ) a 
     INNER JOIN (
        SELECT wp_posts.ID 
        FROM wp_posts 
        INNER JOIN wp_term_relationships ON wp_posts.ID = wp_term_relationships.object_id 
        WHERE wp_term_relationships.term_taxonomy_id = 84 
        ) b 
      ON a.ID = b.ID 
+0

比仅仅改变和或者更复杂 – DaveRlz

+1

取决于他是否希望与两者匹配的结果(如我的示例中)或匹配的结果 - 在这种情况下或者是要走的路。 – twoleggedhorse

0

我假设你需要使用“OR”而不是“AND”。我的猜测是,你不是在寻找taxonomy_id是83和84的帖子,但是它是两者之一吗?

0

您所查询的说:

WHERE wp_term_relationships.term_taxonomy_id = 83 
AND wp_term_relationships.term_taxonomy_id = 84 

这将返回任何结果,我怀疑你应该更改为OR