Mysql 组_CONCAT,返回一行和空问题

Mysql 组_CONCAT,返回一行和空问题,mysql,sql,database,select,Mysql,Sql,Database,Select,我有一个问题,似乎类似于其他人张贴之前,但这些解决方案似乎并不真正适合我 我试图做的是从一个数据库中选择与特定用户(在另一个数据库中找到)相关的行,然后从第三个数据库中选择与之相关的任何附件,因此: 表用户(id是我们从中获取的全部) 表成员资格(我需要员工id和团队id) 表msg_group(id、开始、过期和消息是im关心的) 表msg_attach(id、标识、类型和文件是我在此需要的) 所以。我有一个疑问: SELECT msg_group.message, msg_group.s

我有一个问题,似乎类似于其他人张贴之前,但这些解决方案似乎并不真正适合我

我试图做的是从一个数据库中选择与特定用户(在另一个数据库中找到)相关的行,然后从第三个数据库中选择与之相关的任何附件,因此:

  • 用户
    (id是我们从中获取的全部)
  • 成员资格
    (我需要员工id和团队id)
  • msg_group
    (id、开始、过期和消息是im关心的)
  • msg_attach
    (id、标识、类型和文件是我在此需要的)
所以。我有一个疑问:

SELECT msg_group.message, msg_group.starts, 
       msg_group.expires, 
       GROUP_CONCAT(msg_attach.file SEPARATOR ',')
FROM `membership`
INNER JOIN `msg_group` 
       ON membership.group_id = msg_group.group_id 
LEFT JOIN `msg_attach` 
       ON msg_group.id = msg_attach.ident AND msg_attach.type = "1"
WHERE membership.staff_id = "1"
AND msg_group.starts <= CURRENT_TIMESTAMP 
AND msg_group.expires >= CURRENT_TIMESTAMP 
ORDER BY msg_group.expires ASC LIMIT 0, 30
附加信息:

---------------------------------
| id | type | ident| file       |
| 1  |  1   |  3   | corona.jpg |
| 2  |  1   |  3   | peroni.png |
---------------------------------
因此,我希望我的查询返回:

------------------------------------------------------------
| message       | starts | expires | file                  |
| PIES          | date1  | date2   | null                  |
| CAKES         | date1  | date2   | null                  |
| BEERS         | date1  | date2   | corona.jpg,peroni.png |
| POMMEGRANITES | date1  | date2   | null                  |
------------------------------------------------------------
我得到的是:

------------------------------------------------------------
| message       | starts | expires | file                  |
| BEERS         | date1  | date2   | corona.jpg,peroni.png |
------------------------------------------------------------
或者使用ISNULL:

------------------------------------------------------------------------------
| message       | starts | expires | file                                    |
| BEERS         | date1  | date2   | null, corona.jpg,peroni.png, null, null |
------------------------------------------------------------------------------

这都是忽略了会员和用户的东西,我不/认为/是相关的问题。如果没有GROUP_CONCAT(即仅msg_attach.file),我将返回5行,两行用于啤酒,文件分别列出。

简化的查询应如下所示

SELECT  a.message, a.starts, a.expires,
        GROUP_CONCAT(b.file) fileList
FROM    msg_group a
        LEFT JOIN msg_attach b
            ON a.group_ID = b.type AND
                a.id = b.ident
GROUP   BY a.message, a.starts, a.expires
编辑:由Bogomip编写,因为我不知道如何对此做出完整的评论:

谢谢,我已经做了一些修改来合并用户和其他东西,但是现在可以了:)

选择msg_group.message、msg_group.start、msg_group.expires、group_CONCAT(msg_attach.file)附件
来自味精集团
membership.group\u id=msg\u group.group\u id上的内部加入成员资格
左连接msg_group.id上的msg_attach=msg_attach.ident和msg_attach.type=“1”
其中membership.staff_id=“1”
和msg_group.start=当前_时间戳
GROUP BY msg_GROUP.expires、msg_GROUP.start、msg_GROUP.message
由msg_集团订购。过期ASC限额0,30

简化的查询应该是这样的

SELECT  a.message, a.starts, a.expires,
        GROUP_CONCAT(b.file) fileList
FROM    msg_group a
        LEFT JOIN msg_attach b
            ON a.group_ID = b.type AND
                a.id = b.ident
GROUP   BY a.message, a.starts, a.expires
编辑:由Bogomip编写,因为我不知道如何对此做出完整的评论:

谢谢,我已经做了一些修改来合并用户和其他东西,但是现在可以了:)

选择msg_group.message、msg_group.start、msg_group.expires、group_CONCAT(msg_attach.file)附件
来自味精集团
membership.group\u id=msg\u group.group\u id上的内部加入成员资格
左连接msg_group.id上的msg_attach=msg_attach.ident和msg_attach.type=“1”
其中membership.staff_id=“1”
和msg_group.start=当前_时间戳
GROUP BY msg_GROUP.expires、msg_GROUP.start、msg_GROUP.message
由msg_集团订购。过期ASC限额0,30

你能用你想要的输出显示数据吗?添加了示例表-不是相同的上下文,而是相同的情况。你能用你想要的输出显示数据吗?添加了示例表-不是相同的上下文,而是相同的情况。非常感谢JW-不得不做一些小改动,正如我在上面的帖子中编辑的那样-希望这样可以(我把它全部放在下面)。只是一个查询,GROUP BY做什么?我查看了mysql文档,但它似乎是一个聚合函数,没有解释GROUP BY实际做什么:)下面是关于
GROUP BY
子句的完整文档
GROUP_CONCAT
是一个聚合函数。非常感谢JW-我在上面的帖子中编辑了一些小改动-希望一切正常(我将其全部放在下面)。只是一个查询,GROUPBY做什么?我查看了mysql文档,但它似乎是一个聚合函数,没有解释GroupBy实际上做了什么:)下面是关于
groupby
子句的完整文档<代码>组_CONCAT是一个聚合函数。
SELECT  msg_group.message, msg_group.starts, msg_group.expires, GROUP_CONCAT(msg_attach.file) attachments
FROM    msg_group
INNER JOIN membership ON membership.group_id = msg_group.group_id 
LEFT JOIN msg_attach ON msg_group.id = msg_attach.ident AND msg_attach.type = "1"
WHERE membership.staff_id = "1"
AND msg_group.starts <= CURRENT_TIMESTAMP 
AND msg_group.expires >= CURRENT_TIMESTAMP 
GROUP   BY msg_group.expires, msg_group.starts, msg_group.message
ORDER BY msg_group.expires ASC LIMIT 0, 30