【问题标题】:In mysql how do I add another table join within a subquery?在 mysql 中,如何在子查询中添加另一个表连接?
【发布时间】:2012-02-10 15:24:06
【问题描述】:
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

期望的目标是让一个子选择连接三个表 像这样(如下),但这种语法不起作用

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

【问题讨论】:

  • 您的查询语法不好。 INNER JOIN Status.ID ON t.ID。这是什么?

标签: mysql sql join subquery


【解决方案1】:

检查您的查询,第三个内连接没有条件。如果你要去INNER JOIN它,你不需要在你的FROM子句中包含Status

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;

【讨论】:

  • @ Matten 应该是 FROM Storage s, Status p 吗?我是否需要在该表之后添加一个变量,因此 p
  • 这仍然不起作用。我在子句错误中得到一个未知列
  • 不,就像我写的一样。不要将Status 添加到FROM 子句中。你从哪里得到错误?
【解决方案2】:

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

显式连接:

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.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

最终用户的最终结果是相同的,并且 DBMS 也以相同的方式处理两个查询,因此使用其中一个或另一个不会增加性能。

编辑:

要求更改后,这是我认为您正在寻找的查询:

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

Example

结果:

+----------+-------------+----------+--------------+---------+-----------+----------+-------+
|  TITLE   | DESCRIPTION |  CACHE   |    DRIVE     |  ERROR  | ERRORHIGH | ERRORLOW | AREA  |
+----------+-------------+----------+--------------+---------+-----------+----------+-------+
| Seagate  | Durka Durka |   400000 | 100000000000 |    1000 |      2000 |        0 | US    |
| Scansoft | Blah.. Blah | 80000000 | 250000000000 | 1000000 |   2000000 |        0 | CHINA |
+----------+-------------+----------+--------------+---------+-----------+----------+-------+
  • 请注意,您的问题中有两列名为 ErrorHigh。
  • 数学“错误”x + x = 2 * x(其中 x = u4.value * s.error_value)
  • 可能是最严重的数学错误 :) x - x = 0(其中 x = u5.value * s.error_value)

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

【讨论】:

  • 我得到相同的结果显示 3 次
  • 那一定是数据问题。检查此link。请使用重复的数据更新您的问题以跟踪问题。
  • @MOstly Mostacho 如果您可以看一下,我更改了原件。我把它放进了 msql fiddle 但我没有保存
  • 更新了我的答案。看看吧。
  • 像个老板!主要感谢莫斯塔乔!解决了它
猜你喜欢
  • 2015-02-21
  • 1970-01-01
  • 2015-11-17
  • 2020-09-10
  • 1970-01-01
  • 2021-11-30
  • 2019-02-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多