【问题标题】:Order query results by two key/value pairs, where the fields for the key/value pairs are the same按两个键/值对对查询结果进行排序,其中键/值对的字段相同
【发布时间】:2012-04-17 01:07:53
【问题描述】:

我有一个查询来选择第二个表 (wp_postmeta) 上存在 1 个键/值对或另一个的帖子 (wp_posts table)。基本上,这是可行的,但我需要按第一个键/对值 (department_head) 和第二个 (staff_surname) 对结果进行排序。

问题是,由于查询获取结果的方式,没有department_head 键可用于对结果进行排序。我猜这是因为查询首先找到了staff_surname 键?

再次猜测,但如果我上面的猜测是正确的,那是因为,即使我加入了两次表,当满足staff_surname 条件时,MYSQL 只是从wp_postmeta 表中获取第一个实例。这就是我需要四处寻找的东西,以便我有正确的数据来排序结果。

完整查询 -

SELECT SQL_CALC_FOUND_ROWS wp_posts.*
FROM wp_posts
INNER JOIN wp_term_relationships ON (wp_posts.ID = wp_term_relationships.object_id)
INNER JOIN wp_postmeta ON (wp_posts.ID = wp_postmeta.post_id)
INNER JOIN wp_postmeta AS mt1 ON (wp_posts.ID = mt1.post_id)
WHERE 1=1
AND (
    wp_term_relationships.term_taxonomy_id IN (34)
)
AND wp_posts.post_type = 'people'
AND (
    wp_posts.post_status = 'publish'
    OR wp_posts.post_status = 'private'
)
AND (
    (
        wp_postmeta.meta_key = 'department_head'
        AND CAST(wp_postmeta.meta_value AS CHAR) = 'private-client'
    )
    OR (
        mt1.meta_key = 'staff_surname'
        AND CAST(mt1.meta_value AS CHAR) != ''
    )
)
GROUP BY wp_posts.ID
ORDER BY mt1.meta_value ASC
LIMIT 0, 10

查询结果示例-

ID  name   meta_id post_id meta_key    meta_value    meta_id  post_id  meta_key       meta_value

1   Test1  10      1       random_key  random_value  11       1        staff_surname  Smith
2   Test1  20      2       random_key  random_value  21       2        staff_surname  Jones
3   Test1  30      3       random_key  random_value  31       3        staff_surname  Harris

如果琼斯是部门主管,我需要的示例 -

ID  name   meta_id post_id meta_key         meta_value      meta_id  post_id  meta_key       meta_value

1   Test1  10      1                                        11       1        staff_surname  Smith
2   Test1  22      2       department_head  private-client  21       2        staff_surname  Jones
3   Test1  30      3                                        31       3        staff_surname  Harris

'department_head' 键在绝大多数情况下不存在,这就是为什么键/值在其他结果中为空白的原因。

有没有办法达到我需要的排序结果?

注意:我在此处发布此内容而不是在 Wordpress 网站上发布的原因是因为这是一个自定义查询,不是 WP 生成的,因此它可能超出了大多数 WP 的范围专家。

【问题讨论】:

    标签: mysql sql-order-by


    【解决方案1】:

    我不确定,但我会尝试使用一些 LEFT JOINS 来解决这个问题,并将条件移动到 JOINS 以提高查询效率。

    类似的东西可能会起作用...

    SELECT p.*
    FROM wp_posts p
    INNER JOIN wp_term_relationships r ON 
        (p.ID=r.object_id AND r.term_taxonomy_id=34)
    LEFT JOIN wp_postmeta m1 ON 
        (p.ID=m1.post_id AND m1.meta_key='department_head' AND CAST(m1.meta_value AS CHAR)='private-client')
    LEFT JOIN wp_postmeta m2 ON 
        (p.ID=m2.post_id AND m2.meta_key = 'staff_surname' AND CAST(m2.meta_value AS CHAR) != '')
    WHERE 
        p.post_type = 'people' 
      AND 
        (p.post_status = 'publish' OR p.post_status = 'private')
    GROUP BY p.ID
    ORDER BY m1.meta_value DESC, m2.meta_value DESC
    LIMIT 0, 10
    

    【讨论】:

    • 你到底是怎么把那个从袋子里拿出来的,我永远不会知道!像魅力一样工作,完全满足我的需要,并且启动时我发现我能够通过 WP 过滤器进行此查询,因此需要的编码要少得多。唯一非常轻微的变化是我必须将m1.meta_value ASC 更改为DESC。非常感谢您的帮助。
    • 非常感谢,我相信其他人将来会觉得这很有帮助。
    猜你喜欢
    • 1970-01-01
    • 2015-04-06
    • 1970-01-01
    • 2021-10-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-19
    • 1970-01-01
    相关资源
    最近更新 更多