首页 文章

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

提问于
浏览
0

这个古老的问题(#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_valueexample_featured )的值是1(一) . 然后想要使用另一个使用另一个 meta_keyexample_sort )传递的元值对结果进行排序 . 如果我从查询中删除 AND $meta_table.meta_key = 'example_sort' 然后获取这些帖子ID,但是通过上面的查询我什么也得不到 .

我该怎么做?

1 回答

  • 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 ,并进行相应的排序 .

相关问题