我有以下MYSQL查询-试图联接3个表并找到唯一的(不同的)信息(数据)
SELECT a.LocationID, a.Model, a.SerialNum,a.Purpose, b.IP, a.Services,a.DeviceID, COUNT(a.Hostname)
FROM RefConnection.Equipment_Info a, RefConnection.Connections b, RefConnection.VM_Info c
JOIN Equipment_Info on b.Hostname = a.Hostname
WHERE a.Hostname = c.Hostname
AND b.status = a.Status
AND a.status = c.Status
GROUP BY a.LocationID, a.Model, a.SerialNum, a.Purpose, b.IP, a.Services, a.DeviceID
ORDER BY COUNT(b.Hostname)DESC;
这适用于2个表:
SELECT d.locationID, d.Model, d.SerialNum, d.Status, da.IP, COUNT(d.HOSTNAME)
FROM RefConnection.Equipment_Info d, RefConnection.Connections da
WHERE d.Hostname = da.Hostname
AND d.Status = da.Status
Group By d.locationID, d.Model, d.locationID, d.Model, d.SerialNum, d.Status, da.IP
ORDER BY COUNT(da.Hostname) DESC;
“ on子句”中的未知列“ b.Hostname”
Select b.LocationID, b.Model, b.SerialNum, a.Purpose, a.IP, b.Services,b.DeviceID,c.applications,c.OS, Count(a.Hostname)
FROM RefConnection.Equipment_Info b JOIN
RefConnection.Connections a
ON a.Hostname = b.Hostname AND
a.status = b.Status JOIN
RefConnection.VM_Info c
ON b.Hostname = c.Hostname AND
b.status = c.Status
group by b.LocationID, b.Model, b.SerialNum, a.Purpose, a.IP, b.Services, b.DeviceID, c.applications, c.OS
order by COUNT(b.Hostname)desc;
运行此查询-期望a显示来自RefConnection的所有3个表的联接输出,如所有3个表(Connections,Equipment_info,VM_Info)包含(主机名,状态)。 (Equipment_Info和VM_Info)表包含(LocationID,OS)。尝试获取唯一的(不同的)主机名及其状态,这些主机名应与位置ID和相应的操作系统信息相关联。不确定我哪里出问题了吗?
答案 0 :(得分:0)
用于联接操作的旧式逗号语法在逻辑上等效于较新的JOIN
关键字。但是优先顺序有所不同。
参考:https://dev.mysql.com/doc/refman/8.0/en/join.html
节选:
在没有连接条件的情况下,
INNER JOIN
和,
(逗号)在语义上等效:都在指定的表之间产生笛卡尔积(即,第一个表中的每一行都是连接到第二个表中的每一行。但是,逗号运算符的优先级小于
INNER JOIN
,CROSS JOIN
,LEFT JOIN
等。如果在存在联接条件的情况下将逗号联接与其他联接类型混合,则可能会发生Unknown column 'col_name' in 'on clause'
形式的错误。本节稍后将提供有关解决此问题的信息。
最佳做法是不要在同一条语句中混合使用逗号语法和JOIN语法。
新SQL的最佳实践是避免使用逗号语法。能够支持旧版SQL真是太好了。但是新的SQL不需要使用它。