【问题标题】:Aggregate table before join MySQL (GROUP BY)加入MySQL之前的聚合表(GROUP BY)
【发布时间】:2012-01-07 04:01:21
【问题描述】:

我需要先聚合一个表,然后再将其与其他表连接。

wp_postmeta GROUP BY wp_postmeta.post_id

有可能吗?我应该把它放在哪里?这是我的代码:

SELECT wp_posts.post_content, wp_posts.ID, wp_terms.slug
FROM wp_posts
JOIN wp_postmeta ON wp_posts.ID = wp_postmeta.post_id
JOIN wp_term_relationships ON wp_posts.ID = wp_term_relationships.object_id
JOIN wp_term_taxonomy ON wp_term_relationships.term_taxonomy_id = wp_term_taxonomy.term_taxonomy_id
JOIN wp_terms ON wp_term_taxonomy.term_id = wp_terms.term_id


WHERE wp_posts.post_type = 'my-type'
   AND wp_posts.post_status = 'publish'
   AND wp_terms.slug IN
      ('field1', 'field2', 'field3')
   AND
   (
        wp_postmeta.meta_key = 'exclude' AND wp_postmeta.meta_value <> '111'
        OR wp_postmeta.meta_key = 'include' AND wp_postmeta.meta_value = '22'
        OR wp_postmeta.meta_key <> 'include' AND wp_postmeta.meta_key <> 'exclude'
   )

在测试 ruak 示例时发现了一种新方法。我不知道它为什么有效,但它确实有效:

SELECT wp_posts.post_content, wp_posts.ID, wp_terms.slug
FROM wp_posts
JOIN wp_term_relationships ON wp_posts.ID = wp_term_relationships.object_id
JOIN wp_term_taxonomy ON wp_term_relationships.term_taxonomy_id = wp_term_taxonomy.term_taxonomy_id
JOIN wp_terms ON wp_term_taxonomy.term_id = wp_terms.term_id
WHERE wp_posts.post_type = 'my-type'
   AND wp_posts.post_status = 'publish'
   AND wp_terms.slug IN
      ('field1', 'field2', 'field3')
   AND NOT wp_posts.id IN                # ADDED NOT
   (
      SELECT wp_postmeta.post_id
        FROM wp_postmeta
        WHERE wp_postmeta.meta_key = 'exclude' AND wp_postmeta.meta_value = '111'  #SINCE NOT ABOVE I CHANGED <> to =
           OR wp_postmeta.meta_key = 'include' AND wp_postmeta.meta_value <> '22'  #SINCE NOT ABOVE I CHANGED = to <>
           #I DELETED THIS LINE
   )

现在,如果未设置包含或排除,则查询会返回数据。如果是,它会检查 ID。

我的零钱有什么现金吗?

更多改进:

SELECT wp_posts.post_content, wp_posts.ID, wp_terms.slug
FROM wp_posts
JOIN wp_term_relationships ON wp_posts.ID = wp_term_relationships.object_id
JOIN wp_term_taxonomy ON wp_term_relationships.term_taxonomy_id = wp_term_taxonomy.term_taxonomy_id
JOIN wp_terms ON wp_term_taxonomy.term_id = wp_terms.term_id

WHERE wp_posts.post_type = 'my-type'
AND wp_posts.post_status = 'publish'
AND wp_terms.slug IN
('field1', 'field2', 'field3')

AND wp_posts.id NOT IN
(
SELECT wp_postmeta.post_id
FROM wp_postmeta

WHERE wp_postmeta.meta_key = 'exclude'
AND wp_postmeta.meta_value IN
('$id', '$id,%', '%,$id,%', '%,$id')

OR wp_postmeta.meta_key = 'include' 
AND wp_postmeta.meta_value NOT IN
('$id', '$id,%', '%,$id,%', '%,$id')

wp_postmeta 表的外观示例:

场景 1 - 只有 id 为 18 的页面才能获取数据:

meta_id     post_id     meta_key    meta_value
1           30          include     18
2           30          _edit_lock  1322225789:1
3           30          _edit_last  1

Senario 2 - id 为 18 的页面不应获取数据:

meta_id     post_id     meta_key    meta_value
1           30          exclude     18
2           30          _edit_lock  1322225789:1
3           30          _edit_last  1

场景 1 - 所有页面都应获取数据:

meta_id     post_id     meta_key    meta_value
2           30          _edit_lock  1322225789:1
3           30          _edit_last  1

【问题讨论】:

    标签: mysql join group-by where


    【解决方案1】:

    我认为你根本不应该真正加入wp_postmeta,因为你实际上并不需要它的任何东西;相反,您应该使用INEXISTS 子句执行“半连接”。例如:

    SELECT wp_posts.post_content, wp_posts.ID, wp_terms.slug
    FROM wp_posts
    JOIN wp_term_relationships ON wp_posts.ID = wp_term_relationships.object_id
    JOIN wp_term_taxonomy ON wp_term_relationships.term_taxonomy_id = wp_term_taxonomy.term_taxonomy_id
    JOIN wp_terms ON wp_term_taxonomy.term_id = wp_terms.term_id
    WHERE wp_posts.post_type = 'my-type'
       AND wp_posts.post_status = 'publish'
       AND wp_terms.slug IN
          ('field1', 'field2', 'field3')
       AND wp_posts.id IN
       (
          SELECT DISTINCT wp_postmeta.post_id
            FROM wp_postmeta
            WHERE wp_postmeta.meta_key = 'exclude' AND wp_postmeta.meta_value <> '111'
               OR wp_postmeta.meta_key = 'include' AND wp_postmeta.meta_value = '22'
               OR wp_postmeta.meta_key <> 'include' AND wp_postmeta.meta_key <> 'exclude'
       )
    

    【讨论】:

    • ruakh,我已经更新了我的问题。您对我的新示例有任何 cmets 吗?
    • @Hakan:如果wp_postmeta.post_id 是唯一的——也就是说,如果两个不同的wp_postmeta 记录总是具有不同的post_id 值——那么你的新示例对我来说看起来很完美。我唯一的评论是写“___ NOT IN (...)”比写“NOT ___ IN (...)”更常见;但那里没有真正的区别,所以你的方式是 100% 好的。
    • 我现在开始掌握这个窍门(我想)。我再次更新了这个问题。艰难的 post_id 将列在表 wp_postmeta 的多行中。我将在我的问题中添加示例。
    【解决方案2】:

    【讨论】:

      猜你喜欢
      • 2016-04-03
      • 1970-01-01
      • 2016-02-04
      • 2014-11-22
      • 2014-12-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-03
      相关资源
      最近更新 更多