【问题标题】:mysql query - where clause active only for the selection of a particular fieldmysql 查询 - where 子句仅对特定字段的选择有效
【发布时间】:2020-12-21 12:27:49
【问题描述】:

假设我们有 2 个表:

t1:带有 t1.doc_id 列,... 看起来像这样:

t1.doc_id
1
2
3
4

t2:包含列 t2.from_doc_idt2.to_doc_idt2.flag、... 看起来像这样

from_doc_id to_doc_id flag
1 100 null
1 101 null
2 100 null
3 8 set

我想得到这样的查询结果:

t1.doc_id refs
1 100, 101
2 100
3

基本上,无论flagnull,我都想收集所有to_doc_id 并将它们连接成一个字符串,如果flag 不是null。就像上面示例中的前两个结果一样。

如果flag 不为空(如t2 示例中的第三行),我仍然想在查询结果中获取3,但refs 字段不应包含8

有一个查询:

SELECT t1.doc_id, group_concat(t2.to_doc_id) AS refs
FROM t1
LEFT OUTER JOIN t2 ON t2.from_doc_id = t1.id 
WHERE t2.flag is null

...我完全错过了最后一行,我只得到了预期结果的前两行。

所以我想,我想要的是在group_concat 中使用WHERE t2.flag is null,但是当我得到t1.doc_id 值时忽略t2.flag。

【问题讨论】:

    标签: mysql group-concat


    【解决方案1】:

    你可以在GROUP_CONCAT里面使用CASE

    SELECT from_doc_id
          ,group_concat(CASE WHEN flag IS NULL THEN to_doc_id ELSE '' END) AS refs
    FROM yourtable t1
    JOIN yourtable2 t2 ON t1.doc_id = t2.from_doc_id
    GROUP BY from_doc_id
    

    Demo on db<>fiddle

    【讨论】:

    • 确实,这是最好的解决方案。优素福也在同一方向,但CASEGROUP_CONCAT 之外。谢谢!
    • 不客气 :) @ValentinDumitru。您只能将一个答案标记为已解决,但如果您认为它对您有帮助,您也可以对多个答案进行投票(通过单击刻度线上方的向上箭头)。
    • 我已经这样做了,但由于我的声誉得分很低,我的点赞被记录下来,但没有公开显示。
    猜你喜欢
    • 2013-09-04
    • 2018-06-30
    • 1970-01-01
    • 2011-07-05
    • 1970-01-01
    • 2021-01-20
    • 1970-01-01
    • 2019-08-27
    • 1970-01-01
    相关资源
    最近更新 更多