首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MySQL:从第二个表中按值排序,如果值未设置,则使用默认设置

MySQL:从第二个表中按值排序,如果值未设置,则使用默认设置
EN

Stack Overflow用户
提问于 2013-11-07 14:33:39
回答 1查看 278关注 0票数 0

这发生在WordPress内部,但这是一个一般的MySQL问题。

有两个表,其中一个包含posts,另一个通过ID链接元数据。

代码语言:javascript
复制
post_title | ID     post_id | meta_key | meta_value
-----------+---     --------+----------+-----------
title      | 1      1       | key_1    | aaa
-----------+---     --------+----------+-----------
title      | 2      1       | key_2    | bbb
                    --------+----------+-----------
                    1       | mykey    | 1
                    --------+----------+-----------
                    2       | key_n    | ccc ddd

我试图对某些列值进行排序,这些结果可能不是为所有行设置的。基本上,我希望先设置列/值对的行,然后是所有其他行。每个帖子都可能有一些元数据,基于meta_keymeta_value对。一个帖子可能有更多的键,它们不需要包含我想要分类的键。

问题是,使用MySQL查询和WHERE meta_key = mykey将排除不存在此键的所有帖子。因此,我需要一种方法来显示所有这些帖子的默认值,在这些帖子中,这个元键并不存在。

第一步:很容易选择具有特定meta_key的所有行:

代码语言:javascript
复制
SELECT
    p.ID, p.post_title, p.post_type, p.post_date, m.meta_value
FROM wp_posts AS p
LEFT JOIN wp_postmeta AS m ON p.ID = m.post_id 
WHERE
    m.meta_key = 'mykey'

第二步:如何选择不存在此meta_key的所有行?

我的意思是,但这可能是个糟糕的解决方案:

代码语言:javascript
复制
SELECT
    p.ID, p.post_title, p.post_type, p.post_date, "some_default"
FROM wp_posts AS p
WHERE
    p.ID NOT IN (
        SELECT
            p.ID
        FROM wp_posts AS p
        LEFT JOIN wp_postmeta AS m ON p.ID = m.post_id 
        WHERE
           m.meta_key = 'mykey'
    )

第三步:显示组合结果。这可能是上述两个查询的UNION

我相信一定有更好的治疗方法。更重要的是,我不知道如何指定额外的参数--例如,首先找到所有带有给定元键、标题或类别等的帖子,然后按照上面的布局按said mykey排序。

最终编辑

如果有人感兴趣,以下是上下文中的最后解决方案。RedFilter的回答使它成为可能,再次感谢.

代码语言:javascript
复制
SELECT p1.ID, p1.post_title, p1.post_type, p1.post_date, m1.meta_value AS meta1, meta2
FROM wp_posts AS p1
LEFT JOIN wp_postmeta AS m1 ON m1.post_id = p1.ID
LEFT JOIN wp_term_relationships AS tr0 ON tr0.object_id = p1.ID
LEFT JOIN wp_term_taxonomy AS tt0 ON tr0.term_taxonomy_id = tt0.term_taxonomy_id 
LEFT JOIN wp_terms AS t0 ON tt0.term_id = t0.term_id 
LEFT JOIN
(   
    SELECT
        p.ID, IF (m.meta_value = 'on', 1, 0) AS meta2
    FROM wp_posts AS p
        LEFT JOIN wp_postmeta AS m 
            ON p.ID = m.post_id 
            and m.meta_key = 'mykey'
) as extra 
    ON extra.ID = p1.ID
WHERE 1 = 1 
    AND m1.meta_key = 'some-other-meta-key'
    AND p1.post_type IN ('post', 'some-custom-post-type')
    AND tt0.taxonomy = 'some-taxonomy' 
    AND t0.term_id = 'some-id' 
ORDER BY meta2 DESC, meta1 ASC, p1.post_date DESC
EN

Stack Overflow用户

回答已采纳

发布于 2013-11-07 14:40:02

代码语言:javascript
复制
SELECT p.ID, p.post_title, p.post_type, p.post_date, 
    ifnull(m.meta_value, 'default val') as meta_value
FROM wp_posts AS p
LEFT JOIN wp_postmeta AS m ON p.ID = m.post_id 
    and m.meta_key = 'mykey'
票数 2
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19838540

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档