在mysql中,如何在子查询中添加另一个表联接?

在mysql中,如何在子查询中添加另一个表联接?,mysql,sql,join,subquery,Mysql,Sql,Join,Subquery,期望的目标是让一个子选择连接三个表 类似于下面的内容,但这种语法不起作用 Table: Unit ID NAME VALUE 1 Kilo 1000 2 Mega 1000000 3 Giga 1000000000 Table: Storage ID Title Drive_value DriveUnitID Cache_value CacheUnitID Status_ID error error_unit area 1 Seagate 100 3

期望的目标是让一个子选择连接三个表 类似于下面的内容,但这种语法不起作用

Table: Unit
ID NAME  VALUE
1  Kilo  1000
2  Mega  1000000
3  Giga  1000000000

Table: Storage
ID Title   Drive_value DriveUnitID Cache_value CacheUnitID Status_ID error error_unit area
1  Seagate  100         3          400         1           2         1     1          1
2  Scansoft 250         3          80          2           1         1     2          2

Table: manufac
    ID   area 
    1    US
    2    CHINA 

Table: Status
ID   Description 
1    Blah.. Blah
2    Durka Durka

检查您的查询,第三个内部联接没有条件。如果要进行
内部连接
它,则不需要在
FROM
子句中包含
状态

select 
s.title, 
t.description,
x.area,
u1.value * s.cache_value as Cache,
u2.value * s.drive_value as Drive,
u3.value * s.error_value as Error
((u4.value * s.error_value)+(u4.value * s.error_value)) as ErrorHigh
((u5.value * s.error_value)-(u5.value * s.error_value)) as ErrorHigh
from storage s
join status t on t.id = s.status_id
join manufac x on x.id = s.manufac_id 
join unit u1 on s.cache_unit_id = u1.id
join unit u2 on s.drive_unit_id = u2.id
join unit u3 on s.error_unit_id = u3.id
join unit u4 on s.error_unit_id = u4.id
join unit u5 on s.error_unit_id = u5.id

检查您的查询,第三个内部联接没有条件。如果要进行
内部连接
它,则不需要在
FROM
子句中包含
状态

select 
s.title, 
t.description,
x.area,
u1.value * s.cache_value as Cache,
u2.value * s.drive_value as Drive,
u3.value * s.error_value as Error
((u4.value * s.error_value)+(u4.value * s.error_value)) as ErrorHigh
((u5.value * s.error_value)-(u5.value * s.error_value)) as ErrorHigh
from storage s
join status t on t.id = s.status_id
join manufac x on x.id = s.manufac_id 
join unit u1 on s.cache_unit_id = u1.id
join unit u2 on s.drive_unit_id = u2.id
join unit u3 on s.error_unit_id = u3.id
join unit u4 on s.error_unit_id = u4.id
join unit u5 on s.error_unit_id = u5.id

这些查询在语义上是相同的。但请记住,要么将表放在join子句中,要么放在from子句中:

使用显式联接:

SELECT 
s.Title,
t.Description, 
u1.VALUE * s.Drive_value AS Drive, 
u2.VALUE * s.Cache_value AS Cache
FROM Storage s
INNER JOIN Unit u1 ON u1.ID = s.DriveUnitID
INNER JOIN Unit u2 ON u2.ID = s.CacheUnitID
INNER JOIN Status t ON t.ID = s.Status_ID;
select s.title, t.description,
u1.value * s.cache_value as Cache,
u2.value * s.drive_value as Drive
from storage s
join status t on t.id = s.status_id
join unit u1 on s.cache_unit_id = u1.id
join unit u2 on s.drive_unit_id = u2.id
使用隐式联接:

SELECT 
s.Title,
t.Description, 
u1.VALUE * s.Drive_value AS Drive, 
u2.VALUE * s.Cache_value AS Cache
FROM Storage s
INNER JOIN Unit u1 ON u1.ID = s.DriveUnitID
INNER JOIN Unit u2 ON u2.ID = s.CacheUnitID
INNER JOIN Status t ON t.ID = s.Status_ID;
select s.title, t.description,
u1.value * s.cache_value as Cache,
u2.value * s.drive_value as Drive
from storage s
join status t on t.id = s.status_id
join unit u1 on s.cache_unit_id = u1.id
join unit u2 on s.drive_unit_id = u2.id
最终结果对于最终用户是相同的,DBMS也以相同的方式处理这两个查询,因此使用其中一个查询不会增加性能

编辑:

在需求更改后,我想您正在寻找以下问题:

select s.title, t.description,
u1.value * s.cache_value as Cache,
u2.value * s.drive_value as Drive
from storage s, status t, unit u1, unit u2
where t.id = s.status_id and s.cache_unit_id = u1.id and s.drive_unit_id = u2.id

结果:

select s.title, t.description,
u1.value * s.cache_value as Cache,
u2.value * s.drive_value as Drive,
u3.value * s.error_value as Error,
u3.value * s.error_value * 2 as ErrorHigh,
u3.value * s.error_value - u3.value * s.error_value as ErrorLow,
m.area
from storage s
join status t on t.id = s.status_id
join manufac m on m.id = s.area
join unit u1 on s.cache_unit_id = u1.id
join unit u2 on s.drive_unit_id = u2.id
join unit u3 on s.error_unit_id = u3.id
  • 请注意,在您的问题中有两列名为ErrorHigh
  • 数学“错误”x+x=2*x(其中x=u4.value*s.error\u值)
  • 可能是最严重的数学错误:)x-x=0(其中x=u5.value*s.error\u value)

所以我猜这个查询不是你真正需要的,但应该足以引导你走向正确的方向。祝你好运

此查询在语义上是相同的。但请记住,要么将表放在join子句中,要么放在from子句中:

使用显式联接:

SELECT 
s.Title,
t.Description, 
u1.VALUE * s.Drive_value AS Drive, 
u2.VALUE * s.Cache_value AS Cache
FROM Storage s
INNER JOIN Unit u1 ON u1.ID = s.DriveUnitID
INNER JOIN Unit u2 ON u2.ID = s.CacheUnitID
INNER JOIN Status t ON t.ID = s.Status_ID;
select s.title, t.description,
u1.value * s.cache_value as Cache,
u2.value * s.drive_value as Drive
from storage s
join status t on t.id = s.status_id
join unit u1 on s.cache_unit_id = u1.id
join unit u2 on s.drive_unit_id = u2.id
使用隐式联接:

SELECT 
s.Title,
t.Description, 
u1.VALUE * s.Drive_value AS Drive, 
u2.VALUE * s.Cache_value AS Cache
FROM Storage s
INNER JOIN Unit u1 ON u1.ID = s.DriveUnitID
INNER JOIN Unit u2 ON u2.ID = s.CacheUnitID
INNER JOIN Status t ON t.ID = s.Status_ID;
select s.title, t.description,
u1.value * s.cache_value as Cache,
u2.value * s.drive_value as Drive
from storage s
join status t on t.id = s.status_id
join unit u1 on s.cache_unit_id = u1.id
join unit u2 on s.drive_unit_id = u2.id
最终结果对于最终用户是相同的,DBMS也以相同的方式处理这两个查询,因此使用其中一个查询不会增加性能

编辑:

在需求更改后,我想您正在寻找以下问题:

select s.title, t.description,
u1.value * s.cache_value as Cache,
u2.value * s.drive_value as Drive
from storage s, status t, unit u1, unit u2
where t.id = s.status_id and s.cache_unit_id = u1.id and s.drive_unit_id = u2.id

结果:

select s.title, t.description,
u1.value * s.cache_value as Cache,
u2.value * s.drive_value as Drive,
u3.value * s.error_value as Error,
u3.value * s.error_value * 2 as ErrorHigh,
u3.value * s.error_value - u3.value * s.error_value as ErrorLow,
m.area
from storage s
join status t on t.id = s.status_id
join manufac m on m.id = s.area
join unit u1 on s.cache_unit_id = u1.id
join unit u2 on s.drive_unit_id = u2.id
join unit u3 on s.error_unit_id = u3.id
  • 请注意,在您的问题中有两列名为ErrorHigh
  • 数学“错误”x+x=2*x(其中x=u4.value*s.error\u值)
  • 可能是最严重的数学错误:)x-x=0(其中x=u5.value*s.error\u value)


所以我猜这个查询不是你真正需要的,但应该足以引导你走向正确的方向。祝你好运

您的查询语法不好<代码>t.ID上的内部联接状态.ID。是什么?你的查询语法不好<代码>t.ID上的内部联接状态.ID。这是什么?@Matten应该是存储s的状态p吗?我是否需要在该表之后添加一个变量,因此
p
仍然不起作用。我在子句errorNo中得到一个未知的列,正如我所写的那样。不要将
Status
添加到
FROM
子句中。您从何处获得错误?@Matten是否应该从存储s中获取,状态p?我是否需要在该表之后添加一个变量,因此
p
仍然不起作用。我在子句errorNo中得到一个未知的列,正如我所写的那样。不要将
Status
添加到
FROM
子句中。你从哪里得到的错误?我得到的结果是相同的显示3次,这一定是一个数据问题。看看这个。请用复制的数据更新您的问题,以跟踪问题。@Mostacho,如果您可以看一看,我将更改原始数据。我把它放到msql中,但我没有保存我的答案。看一看,像个老板!非常感谢Mostacho!固定的itI得到相同的结果显示3次,这必须是一个数据问题。看看这个。请用复制的数据更新您的问题,以跟踪问题。@Mostacho,如果您可以看一看,我将更改原始数据。我把它放到msql中,但我没有保存我的答案。看一看,像个老板!非常感谢Mostacho!这就解决了问题