连接表上的MySQL查询条件

时间:2012-05-24 11:31:50

标签: mysql wordpress where-clause

我有以下MySQL查询(查询wordpress db):

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 table wp_terms)'MyTagName'。但以上所有似乎都是从返回的行中删除标记名称,将wp_post条目与其标记的其他标记条目放在一起。

任何人都可以帮我吗?

1 个答案:

答案 0 :(得分: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,只检查特定的wp_terms。如果有5个术语,其中一个是'MyTagName',那么单个术语将被删除,但其他4个术语仍将被连接。

现在关于:

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

你不需要把它们放在大的NOT EXISTS检查中,因为如果其中任何一个都是假的,那么这个帖子就不会被拿起。