Mysql 具有多个条件的SQL查询联接
很抱歉问这个问题,但我找不到解决这个简单问题的方法 我有两张桌子:Mysql 具有多个条件的SQL查询联接,mysql,sql,join,Mysql,Sql,Join,很抱歉问这个问题,但我找不到解决这个简单问题的方法 我有两张桌子: TABLE A R_ID integer CID1 integer CID2 integer CID3 integer CID4 integer TABLE C CID integer NAME varchar(50) 我试图做的是一个查询,为每个表输出一行,CID1,CID2的名称等等,考虑到CID1总是有一个值,CID2,CID3和CID4可能是NULL,我不能在我的 这是我的出发点:
TABLE A
R_ID integer
CID1 integer
CID2 integer
CID3 integer
CID4 integer
TABLE C
CID integer
NAME varchar(50)
我试图做的是一个查询,为每个表输出一行,CID1
,CID2
的名称等等,考虑到CID1
总是有一个值,CID2
,CID3
和CID4
可能是NULL
,我不能在我的
这是我的出发点:
SELECT a.R_ID, c.NAME
FROM A a, C c
WHERE (a.CID1 = c.CID or a.CID2 = c.CID or a.CID3 = c.CID or a.CID4 = c.CID)
但是正如您所看到的,只有当所有CID
s都被赋值时,它才起作用,否则一些结果将有一个空白的NAME
字段
任何关于如何删除不需要的行的提示都将非常感谢
编辑:
我必须打印一个列表:Room#-该房间中学生的姓名,因此输出的表格必须为:R\u ID
,name
假设:
TABLE A
1,1,2,NULL,NULL
2,3,NULL,NULL,NULL
3,4,NULL,NULL,NULL
TABLE B
1, Mark
2, John
3, Steve
4, Nick
我的目标是获得如下表:
R_ID - NAME
1 - Mark
1 - John
2 - Steve
3 - Nick
我得到的是:
1 - Mark
1 - John
1 -
1 -
2 - Steve
2 -
2 -
2 -
3 - Nick
3 -
3 -
3 -
4个左联接的解决方案不适用,因为我不能使用NAME1、NAME2等,而只能使用1个字段名
类似以下的查询:
SELECT r.R_ID, c.NAME
FROM A a LEFT JOIN C c on a.CID1 = c.CID
LEFT JOIN C as c1 on a.CID2 = c1.CID
LEFT JOIN C as c2 on a.CID3 = c2.CID
LEFT JOIN C as c3 on a.CID4 = c3.CID
将输出:
1 - Mark
2 - Steve
3 - Nick
解决方案
NAME not NULL
在SQLFiddle上运行得很好,但在我的mysql 5.5.15
上仍然显示没有名称的行(也在firebird 2.5上试用过,firebird 2.5是我个人电脑上唯一的另一台DB服务器,但效果相同)对于TableA中的每个CID列,需要3个单独的联接
SELECT
R_ID,
c1.Name As CID1Name,
c2.Name As CID2Name,
c3.Name As CID3Name
FROM
TableA a
LEFT JOIN TableC c1 ON a.CID1 = c1.CID
LEFT JOIN TableC c2 ON a.CID2 = c2.CID
LEFT JOIN TableC c3 ON a.CID3 = c3.CID
查询将为每个
cid
值返回一个名称,请参阅
可能存在的问题是name
列中的条目为空或NULL
,请参阅
您可以通过在表a
和c
上进行简单的联接,以及附加的where
子句来解决这个问题
select a.r_id, c.name
from a
join c on c.cid in (a.cid1, a.cid2, a.cid3, a.cid4)
where c.name is not null
当然,您可以通过添加相同的子句来实现隐式连接
SELECT a.R_ID, c.NAME
FROM A a, C c
WHERE (a.CID1 = c.CID or a.CID2 = c.CID or a.CID3 = c.CID or a.CID4 = c.CID)
and c.name is not null
如果您有空字符串而不是NULL
值,那么您也可以将name
换行以处理空白
and trim(c.name) <> ''
和trim(c.name)'
实际问题是什么?在删除bug后,它仍然返回NULL
条目,请查看您到底想要什么?您的意思是不想要任何名称为空的行吗?这不是只返回第一行吗?用您的解决方案解决了,但有一个奇怪的变化:和c.name'
,这样在mysql和firebird上都能完美地工作