选择其中某些值为true的post id,并使用其中的值对它们进行排序

时间:2014-11-09 13:52:24

标签: php mysql wordpress wpdb

古老的问题(#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 ='服务'和post_status ='发布',并且关联meta_valueexample_featured)的值为1(一) 。然后想要使用另一个使用另一个meta_keyexample_sort)传递的元值对结果进行排序。如果我从查询中删除AND $meta_table.meta_key = 'example_sort',那么请获取这些帖子ID,但是上面的查询我什么都没有。

我该怎么做?

1 个答案:

答案 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,并进行相应的排序。