在where

时间:2015-10-30 09:02:07

标签: mysql

我会尽力以最好的方式解释我的问题。

首先,我向您展示我的sql表:

主机:此表包含所有主机,其中一些主机可能是模板,具体取决于寄存器的值

--- ID --- --- host_name ---注册---

 1         host1            1
 2         host2            1
 3         template1        0
 4         template2        0

主机模板:这是将主机与模板链接的关联表,多个模板可以链接到主机,主机可能没有模板。

--- ID --- --- id_host --- --- id_template ---

1             1              3
2             1              4

我想检索所有主机及其相关模板,即使它们没有:

--- host_name --- --- template ---

    host1       template1, template2
    host2            NULL

我尝试使用左连接执行此操作,我只在结果中获取host1:

SELECT h.host_name, GROUP_CONCAT( ht.host_name ) 
FROM host_template sht
LEFT JOIN host h ON h.id = sht.id_host
LEFT JOIN host ht ON ht.id = sht.id_template
WHERE ht.register =0
GROUP BY host_name

另一种方法是在左连接中添加OR子句。在结果中,我有host2,但有所有模板......

SELECT h.host_name, GROUP_CONCAT( ht.host_name ) 
FROM host_template sht
LEFT JOIN host h ON h.id = sht.id_host OR sht.id_host IS NULL 
LEFT JOIN host ht ON ht.id = sht.id_template OR sht.id_template IS NULL 
WHERE ht.register =0
GROUP BY host_name

我认为我非常接近找到解决方案,但我需要你们的帮助。谢谢:))

2 个答案:

答案 0 :(得分:2)

重新排序联接可以完成这项工作:

SELECT h.host_name, GROUP_CONCAT( ht.host_name ) 
FROM host h
LEFT JOIN host_template sht ON h.id = sht.id_host
LEFT JOIN host ht ON ht.id = sht.id_template
WHERE h.register <>0
GROUP BY h.host_name

答案 1 :(得分:0)

我认为这条线存在问题:

LEFT JOIN host h ON h.id = sht.id_host OR sht.id_host IS NULL 

您可以在没有OR的情况下尝试INNER JOIN:

INNER JOIN host h ON h.id = sht.id_host 

SQL join

试试这个(在哪里添加第二个参数):

SELECT h1.host_name, GROUP_CONCAT( h2.host_name ) FROM host_template ht
LEFT JOIN host h1 ON h1.id = ht.id_host
LEFT JOIN host h2 ON h2.id = ht.id_template 
WHERE h1.register =0 and h2.register = 0
GROUP BY h1.host_name