仅当字段不为空时才进行内部连接

Sum*_*umz 11 mysql join

我可以通过两个请求完成我想要的任务,但我想只用一个.

事实上,我有4个表:

Table 1 : id, sub-id
Table 2 : id, sub-id
Table 3 : id, login
Table 4 : id, login
Run Code Online (Sandbox Code Playgroud)

我提出这样的要求:

SELECT Table1.id, Table1.sub-id, Table2.id, Table2.sub-id, 
   Table3.login, Table4.login FROM Table1
   INNER JOIN Table2 ON (Table1.id = Table2.id AND Table1.sub-id = Table2.sub-id)
   INNER JOIN Table3 ON (Table3.id = Table1.id)
   INNER JOIN Table4 ON (Table4.id = Table1.id)
   WHERE Table1.id = "my_id" AND Table1.sub-id = "my_subid"
Run Code Online (Sandbox Code Playgroud)

我想加入Table3只有id不是空的,如果它是空的,我加入Table4.

你有什么想法吗?

我听说左连接可以帮助,但我不习惯这些关键字所以...?

krt*_*tek 9

如在其他答案中所述,您可以使用左连接.您还可以添加case语句以只包含一login列:

SELECT 
    Table1.id, 
    Table1.sub-id, 
    Table2.id, 
    Table2.sub-id, 
    CASE 
        WHEN Table3.id IS NOT NULL THEN Table3.login
        ELSE Table4.login
    END CASE AS login
FROM Table1
INNER JOIN Table2 ON (Table1.id = Table2.id AND Table1.sub-id = Table2.sub-id)
LEFT JOIN Table3 ON (Table3.id = Table1.id)
LEFT JOIN Table4 ON (Table4.id = Table1.id)
WHERE Table1.id = "my_id" AND Table1.sub-id = "my_subid"
Run Code Online (Sandbox Code Playgroud)

  • `COALESCE(Table3.login,Table4.login)`给出与`CASE ... END CASE`完全相同的结果. (2认同)

Håv*_*d S 5

使用左联接:

SELECT Table1.id, Table1.sub-id, Table2.id, Table2.sub-id, 
Table3.login, Table4.login FROM Table1
INNER JOIN Table2 ON (Table1.id = Table2.id AND Table1.sub-id = Table2.sub-id)
LEFT JOIN Table3 ON (Table3.id = Table1.id)
LEFT JOIN Table4 ON (Table4.id = Table1.id)
WHERE Table1.id = "my_id" AND Table1.sub-id = "my_subid"
Run Code Online (Sandbox Code Playgroud)

然后,如果存在匹配项,则来自Table3和Table4的行将被合并。否则,这些将是NULL。然后,您可以检查结果并使用Table3中的数据(如果存在)或Table4中的数据。