我会尽力以最好的方式解释我的问题。
首先,我向您展示我的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
我认为我非常接近找到解决方案,但我需要你们的帮助。谢谢:))
答案 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
试试这个(在哪里添加第二个参数):
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