在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 JOIN
也INNER JOIN
但同样的事情发生了:它的优良选择既有“10mi”运行,但给我加MIN
功能错误的输出。
感谢您提供任何帮助。这是我在这里的第一篇文章,所以请让我知道如果我需要添加任何更多的细节。
答
我从来没有轮到发布我的解决方案。现在已经有一段时间了,所以我不能完全记得我是如何到达它的(很可能是试错),但如果这有助于任何人,那么欢迎他们。如果我想到更多的细节,我会将它们添加为这个答案的评论。
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
这基本上由价值订单,只需要第一个答案,即。最低。
UPDATE:使用'ORDER BY m.meta_value LIMIT 1'而不是'MIN'会产生正确的结果,但我不知道如何将这个外推到多个术语slug而不复制查询。当然,使用'MIN'和'GROUP BY'可以做到这一点? – seestevecode 2012-04-09 08:52:53
然后,你需要一个['[[每个组最大]](http://*.com/questions/tagged/greatest-n-per-group)查询。 – 2012-04-09 09:51:32
感谢您的提示@ypercube。它帮助我找到了我在下面发布的解决方案。恐怕我不知道如何在你的帮助中给你更多的信贷,因为你没有把它作为答案。尽管如此,我们非常感激。 – seestevecode 2012-04-09 11:56:04