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上都能完美地工作