我遇到的问题与之前发布的其他问题类似,但这些问题的解决方案似乎并不适用于我。
我要做的是从一个数据库中选择与特定用户(在另一个数据库中找到)相关的行,然后从第三个数据库中选择任何相关的附件,这样:
users
(id就是我们从中获取的所有内容)membership
(staff_id和group_id是我需要的形式)msg_group
(id,starts,expires和message是我所关注的)msg_attach
(id,ident,type和file是我需要的)SO。我有这个问题:
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
问题是,应该返回5行。应该在msg_attach.file列中有“file.jpg,file2.jpg”。这很好,但是在msg_attach列中我还应该有4行以及NULL。
为了解决这个问题,我尝试过使用IFNULL(msg_attach.file,'null')但是这一切都返回了一行,但是file.jpg,file2.jpg,null,null,null,null。
我想要的是行女巫附件是file.jpg,file2.jpg然后又有4行将在该列中“为空”。
我希望我已经解释得这么好了!#
感谢您的帮助。 亚历
编辑:样本表和数据。
msg_group:
------------------------------------------------------------
| id | group_id | message | starts | expires |
| 1 | 1 | PIES | date 1 | date 2 |
| 2 | 1 | CAKES | date 1 | date 2 |
| 3 | 1 | BEERS | date 1 | date 2 |
| 4 | 1 | POMMEGRANITES | date 1 | date 2 |
------------------------------------------------------------
msg_attach:
---------------------------------
| 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行,只有两行,BEERS单独列出文件。
答案 0 :(得分:1)
简化查询应如下所示,
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撰写,因为我不知道如何对此发表全面评论:
谢谢,我不得不进行一些更改以合并用户和内容,但这现在有效:)
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