在WordPress自定义SELECT查询中使用MIN

问题描述:

我试图创建一个自定义SELECT查询来查找我的WordPress自定义类型的个人最佳比赛,其中时间是自定义元字段。在WordPress自定义SELECT查询中使用MIN

这是我用来选择帖子的查询。我已经简化它进行调试,但最终我想用GROUP BY选择若干项蛞蝓,并找到MIN每个:

 SELECT  t.slug, 
        p.ID, 
        p.post_date, 
        p.post_title,      
        m.meta_value as pb_mins 
     FROM  $wpdb->posts p, 
        $wpdb->postmeta m, 
        $wpdb->term_relationships tr, 
        $wpdb->term_taxonomy tt, 
        $wpdb->terms t 
     WHERE  p.ID = tr.object_id 
       AND p.ID = m.post_id 
       AND tr.term_taxonomy_id = tt.term_taxonomy_id 
       AND tt.term_id = t.term_id 
       AND p.post_type = 'runs' 
       AND m.meta_key = 'ssr_duration_min' 
       AND t.slug in ('10mi') 

(我结果输出到一个数组,并使用print_r临时检查)

这将选择两个比赛/运行'10mi'的术语,并显示他们的正确时间/日期/标题。

问题是当我加入MIN功能:

 SELECT  t.slug, 
        p.ID, 
        p.post_date, 
        p.post_title,      
        MIN(m.meta_value) as pb_mins 

正确的(最小)的时间选择,但其他细节(日期,标题)来自其他10mi跑/比赛。

我试图改变FROM子句中使用LEFT JOININNER JOIN但同样的事情发生了:它的优良选择既有“10mi”运行,但给我加MIN功能错误的输出。

感谢您提供任何帮助。这是我在这里的第一篇文章,所以请让我知道如果我需要添加任何更多的细节。

+0

UPDATE:使用'ORDER BY m.meta_value LIMIT 1'而不是'MIN'会产生正确的结果,但我不知道如何将这个外推到多个术语slug而不复制查询。当然,使用'MIN'和'GROUP BY'可以做到这一点? – seestevecode 2012-04-09 08:52:53

+0

然后,你需要一个['[[每个组最大]](http://*.com/questions/tagged/greatest-n-per-group)查询。 – 2012-04-09 09:51:32

+0

感谢您的提示@ypercube。它帮助我找到了我在下面发布的解决方案。恐怕我不知道如何在你的帮助中给你更多的信贷,因为你没有把它作为答案。尽管如此,我们非常感激。 – seestevecode 2012-04-09 11:56:04

我从来没有轮到发布我的解决方案。现在已经有一段时间了,所以我不能完全记得我是如何到达它的(很可能是试错),但如果这有助于任何人,那么欢迎他们。如果我想到更多的细节,我会将它们添加为这个答案的评论。

  SELECT  p1.ID, 
         m1.meta_value, 
         t1.name 
      FROM  $wpdb->posts p1, 
         $wpdb->postmeta m1, 
         $wpdb->term_relationships tr1, 
         $wpdb->term_taxonomy tt1, 
         $wpdb->terms t1, 
         ( SELECT  t2.slug as pb_distance, 
             MIN(m2.meta_value) as pb_duration 
          FROM  $wpdb->posts p2, 
             $wpdb->postmeta m2, 
             $wpdb->term_relationships tr2, 
             $wpdb->term_taxonomy tt2, 
             $wpdb->terms t2 
          WHERE  p2.ID = tr2.object_id 
            AND p2.ID = m2.post_id 
            AND tr2.term_taxonomy_id = tt2.term_taxonomy_id 
            AND tt2.term_id = t2.term_id 
            AND p2.post_type = 'runs' 
            AND p2.post_status = 'publish' 
            AND m2.meta_key = 'ssr_duration_min' 
            AND t2.slug IN $slugs 
          GROUP BY t2.slug) pb 
      WHERE  p1.ID = m1.post_id 
        AND p1.ID = tr1.object_id 
        AND tr1.term_taxonomy_id = tt1.term_taxonomy_id 
        AND tt1.term_id = t1.term_id 
        AND p1.post_type = 'runs' 
        AND p1.post_status = 'publish' 
        AND m1.meta_key = 'ssr_duration_min' 
        AND t1.slug in $slugs 
        AND m1.meta_value = pb.pb_duration 
      ORDER BY meta_value+0 

另一种选择我一直使用,这也适用于一个稍微不同的查询,如下:

 SELECT  p.ID, 
        m.meta_value, 
        t.name 
     FROM  $wpdb->posts p, 
        $wpdb->postmeta m, 
        $wpdb->term_relationships tr, 
        $wpdb->term_taxonomy tt, 
        $wpdb->terms t 
     WHERE  p.ID = m.post_id 
       AND p.ID = tr.object_id 
       AND tr.term_taxonomy_id = tt.term_taxonomy_id 
       AND tt.term_id = t.term_id 
       AND p.post_type = 'runs' 
       AND p.post_status = 'publish' 
       AND m.meta_key = 'ssr_duration_min' 
       AND t.slug IN $slugs 
     ORDER BY meta_value+0 
     LIMIT  1 

这基本上由价值订单,只需要第一个答案,即。最低。