Mysql 按两个键/值对排序查询结果,其中键/值对的字段相同
我有一个查询来选择posts(Mysql 按两个键/值对排序查询结果,其中键/值对的字段相同,mysql,sql-order-by,Mysql,Sql Order By,我有一个查询来选择posts(wp\u posts表),其中第二个表(wp\u postmeta)上有一个键/值对或另一个键/值对。本质上,这是可行的,但我需要按照第一个键/对值(部门负责人)和第二个(员工姓氏)对结果进行排序 问题是,由于查询获取结果的方式不同,因此没有department\u head键可用于对结果进行排序。我猜这是因为查询首先查找staff\u姓氏键 再次猜测,但是如果我上面的猜测是正确的,那是因为,即使我加入了两次表,MYSQL只是在满足staff\u姓氏条件时从wp\u
wp\u posts表
),其中第二个表(wp\u postmeta
)上有一个键/值对或另一个键/值对。本质上,这是可行的,但我需要按照第一个键/对值(部门负责人
)和第二个(员工姓氏
)对结果进行排序
问题是,由于查询获取结果的方式不同,因此没有department\u head
键可用于对结果进行排序。我猜这是因为查询首先查找staff\u姓氏
键
再次猜测,但是如果我上面的猜测是正确的,那是因为,即使我加入了两次表,MYSQL只是在满足staff\u姓氏
条件时从wp\u postemta
表中获取第一个实例。这就是我需要找到的,这样我就有了正确的数据,能够对结果进行排序
完整查询-
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
“部门负责人”键在绝大多数情况下都不存在,这就是为什么其他简历上的键/值为空
有没有办法达到我要求的订购结果
注意:与Wordpress站点相反,我之所以在这里发布此消息,是因为这是一个自定义查询,而不是WP生成的,因此,这可能超出了大多数WP专家的范围。我不确定,但我将尝试使用一些左连接来实现这一点,并将条件移动到连接,以提高查询效率 类似的东西可能会起作用
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_值ASC
更改为DESC
。非常感谢你的帮助。非常感谢,我相信其他人将来会觉得这很有帮助。