这个古老的问题(#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);
表1:wp_posts
+------------+--------------+----------------+
| ID | post_type | post_status |
+------------+--------------+----------------+
| 1 | services | publish |
+------------+--------------+----------------+
表2:wp_postmeta
+------------+------------+------------------+--------------+
| ID | post_id | meta_key | meta_value |
+------------+------------+------------------+--------------+
| 1 | 1 | example_featured | 1 |
| 2 | 1 | example_sort | 5 |
+------------+------------+------------------+--------------+
在进行这个SQL查询时苦苦挣扎:
我想要所有的post_id,其中 post_type
= 'services'和 post_status
= 'publish',并且关联 meta_value
( example_featured
)的值是1(一) . 然后想要使用另一个使用另一个 meta_key
( example_sort
)传递的元值对结果进行排序 . 如果我从查询中删除 AND $meta_table.meta_key = 'example_sort'
然后获取这些帖子ID,但是通过上面的查询我什么也得不到 .
我该怎么做?
1 回答
您已经在做
group by
,因此您可以使用条件聚合来处理此问题 . 这意味着将一些条件移动到having
子句 . 我还介绍了表别名 - 它们使查询更容易编写和读取:这是set-within-sets查询的一个示例 - 也就是说,您正在查看给定帖子的所有元键的逻辑 . 逻辑有两部分,过滤件(在“example_featured”上)和订购件(在“example_sort”上) . 您遇到的问题是此信息位于元表中的两个不同行上 .
HAVING
子句计算满足"example_featured"条件的行数 . 如果遇到任何问题,SUM()
大于0.另外,如果您想保证该值永远不存在,那么您将使用= 0
而不是> 0
.ORDER BY
子句从密钥为"example_sort"的行中提取值 . 如果有多个匹配项,则使用最大值 . 如果没有匹配项,则MAX()
表达式的结果为NULL
,并进行相应的排序 .