古老的问题(#1,#2),我仍然在努力解决这个问题。现在尝试使用简单的SQL查询:
global $wpbd;
$post_table = $wpdb->prefix . 'posts';
$meta_table = $wpdb->prefix . 'postmeta';
$fs_query = "SELECT $post_table.ID
FROM $post_table
INNER JOIN $meta_table
ON ( $post_table.ID = $meta_table.post_id )
WHERE 1=1
AND $post_table.post_type = 'services'
AND $post_table.post_status = 'publish'
AND (
$meta_table.meta_key = 'example_featured'
AND $meta_table.meta_value = 1
)
AND $meta_table.meta_key = 'example_sort'
GROUP BY $post_table.ID
ORDER BY $meta_table.meta_value+0 ASC
LIMIT 0, 8";
my_var_dump($fs_query);
+------------+--------------+----------------+ | ID | post_type | post_status | +------------+--------------+----------------+ | 1 | services | publish | +------------+--------------+----------------+
+------------+------------+------------------+--------------+ | ID | post_id | meta_key | meta_value | +------------+------------+------------------+--------------+ | 1 | 1 | example_featured | 1 | | 2 | 1 | example_sort | 5 | +------------+------------+------------------+--------------+
在进行SQL查询时苦苦挣扎:
我想要所有post_id,其中post_type
='服务'和post_status
='发布',并且关联meta_value
(example_featured
)的值为1(一) 。然后想要使用另一个使用另一个meta_key
(example_sort
)传递的元值对结果进行排序。如果我从查询中删除AND $meta_table.meta_key = 'example_sort'
,那么请获取这些帖子ID,但是上面的查询我什么都没有。
我该怎么做?
答案 0 :(得分:3)
您已经在执行group by
,因此您可以使用条件聚合来处理此问题。这意味着将一些条件移动到having
子句。我还介绍了表别名 - 它们使查询更容易编写和阅读:
SELECT p.ID
FROM $post_table p INNER JOIN
$meta_table m
ON (p.ID = m.post_id )
WHERE p.post_type = 'services' AND
p.post_status = 'publish'
GROUP BY p.ID
HAVING SUM(m.meta_key = 'example_featured' AND m.meta_value = 1) > 0
ORDER BY MAX(CASE WHEN m.meta_key = 'example_sort' then m.meta_value end)
LIMIT 0, 8;
这是set-within-sets查询的一个示例 - 也就是说,您正在查看给定帖子的所有元键的逻辑。逻辑有两部分,过滤件(在“example_featured”上)和订购件(在“example_sort”上)。您遇到的问题是此信息位于元表中的两个不同行上。
HAVING
子句计算满足“example_featured”条件的行数。如果遇到任何问题,SUM()
大于0.顺便说一句,如果您想保证该值从不,那么您将使用= 0
而不是> 0
。
ORDER BY
子句从键为“example_sort”的行中提取值。如果有多个匹配项,则使用最大值。如果没有匹配项,那么MAX()
表达式的结果为NULL
,并进行相应的排序。