【问题标题】:MySQL selecting only certain values from column without excluding rowsMySQL 仅从列中选择某些值而不排除行
【发布时间】:2012-06-20 17:04:52
【问题描述】:

我想知道是否有一种方法可以只选择列中的某些值以用于 GROUP_CONCAT 而不从 SELECT 中排除不匹配的列。

以下是具体场景:对于我的 WordPress 网站,我有 wp_22_postswp_22_postmeta 表,它们在帖子和元数据之间存在一对多关系。我想按wp_22_posts.ID 对加入的结果进行分组,并为每个组选择一个以分号分隔的wp_22_postmeta.meta_keywp_22_postmeta.meta_value 列表。如果键匹配“authorid”或“isbn”,我只想获取元键和值; 但是,我不想排除没有“authorid”或“isbn”的行 - 对于不匹配的行,我宁愿只返回 null 或类似的东西。

以下是我当前正在使用的查询,但正如您所见,它正在拉入 所有 元数据:

SELECT posts.post_title, MAX(posts.post_date_gmt), posts.post_content, posts.guid AS url, posts.comment_count,
    GROUP_CONCAT(postmeta.meta_key ORDER BY postmeta.meta_value DESC SEPARATOR ';') AS meta_key,
    GROUP_CONCAT(postmeta.meta_value ORDER BY postmeta.meta_value DESC SEPARATOR ';') AS meta_value
FROM wp_22_posts AS posts
JOIN wp_22_postmeta AS postmeta ON (posts.ID = postmeta.post_id)
WHERE posts.post_status = 'publish'
GROUP BY posts.ID

【问题讨论】:

    标签: mysql select group-by group-concat


    【解决方案1】:

    我相信您可以使用CASE 代替GROUP_CONCAT 中的列名:

    GROUP_CONCAT(CASE WHEN postmeta.meta_key='authorid' OR postmeta.meta_key='isbn'
     THEN postmeta.meta_key END, .....
    

    抱歉,我目前无法测试它,但它应该可以工作

    【讨论】:

    • +1,该死的,你的速度更快。想写一样的。而且我现在也无法测试它:)
    • 这就像一个魅力。感谢您帮助这位 SQL 业余爱好者!
    猜你喜欢
    • 1970-01-01
    • 2023-03-12
    • 1970-01-01
    • 2019-04-18
    • 2011-06-13
    • 1970-01-01
    • 2021-12-29
    • 1970-01-01
    • 2019-03-17
    相关资源
    最近更新 更多