2012-05-24 178 views
0

我有以下MySQL查询(查询WordPress的DB):MySQL查询条件

SELECT wp_posts.ID, wp_posts.post_date, wp_posts.post_content, wp_posts.post_title, wp_terms.name, wp_term_taxonomy.taxonomy 
FROM wp_posts 
LEFT JOIN wp_term_relationships ON (wp_term_relationships.object_id = wp_posts.ID) 
LEFT JOIN wp_term_taxonomy ON (wp_term_taxonomy.term_taxonomy_id = wp_term_relationships.term_taxonomy_id) 
LEFT JOIN wp_terms ON (wp_terms.term_id = wp_term_taxonomy.term_id) 
WHERE 1=1 
AND wp_terms.name != 'MyTagName' 
AND wp_posts.post_type = 'post' 
AND (wp_posts.post_status = 'publish') 
ORDER BY wp_posts.post_date DESC 
LIMIT 100 

我基本上是试图阻止所有“wp_posts”回来有一个标签(db表wp_terms)' MyTagName”。但是,以上所有内容似乎都是从返回的行中去除该标记名称,并将wp_post条目与其标记的其他标记条目相关联。

任何人都可以帮助我吗?

回答

1
SELECT wp_posts.ID, wp_posts.post_date, wp_posts.post_content, wp_posts.post_title, wp_terms.name, wp_term_taxonomy.taxonomy 
FROM wp_posts 
JOIN wp_term_relationships ON wp_term_relationships.object_id = wp_posts.ID 
JOIN wp_term_taxonomy ON wp_term_taxonomy.term_taxonomy_id = wp_term_relationships.term_taxonomy_id 
JOIN wp_terms ON wp_terms.term_id = wp_term_taxonomy.term_id 
WHERE NOT EXISTS (
    SELECT 1 
    FROM wp_term_relationships 
    JOIN wp_term_taxonomy ON wp_term_taxonomy.term_taxonomy_id = wp_term_relationships.term_taxonomy_id 
    JOIN wp_terms ON wp_terms.term_id = wp_term_taxonomy.term_id 
    WHERE wp_term_relationships.object_id = wp_posts.ID 
     AND wp_terms.name = 'MyTagName' 
    ) 
    AND wp_posts.post_type = 'post' 
    AND wp_posts.post_status = 'publish' 
ORDER BY wp_posts.post_date DESC 
LIMIT 100 

问题是,您当前的解决方案没有检查与帖子相关的所有wp_terms,只是特定的一个。如果有5个条款,其中之一是'MyTagName',那么单个条款将被排除,但其他4个条款仍将被加入。

现在有关:

AND wp_posts.post_type = 'post' 
AND wp_posts.post_status = 'publish' 

你并不需要把他们在大NOT EXISTS检查,因为该职位将不会被无论如何拿起其中任何一项都是假的。

+0

同样我害怕 - 返回有MyTagName作为标签的帖子,只是不会返回包含它的行。 – mootymoots

+0

是的,只是注意到wp_terms表没有直接链接到wp_posts表 - 再次修改答案。 –

+0

很好 - 虽然需要添加:AND wp_posts.post_type ='post' AND(wp_posts.post_status ='publish') – mootymoots