【问题标题】:How do I join 3 tables together with MySQL... and omit the columns from the second "Middle" table如何将 3 个表与 MySQL 连接在一起...并省略第二个“中间”表中的列
【发布时间】:2014-12-18 22:03:33
【问题描述】:

我有 3 张桌子: 用户,包含相关的用户数据

ComputerUsers,它将用户与来自第四个表(在此无关的)计算机表中的信息联系在一起。

最后是软件,它包含各种计算机上存在的软件列表。

将用户与软件联系在一起的唯一方法是

Users.User_ID <-> ComputerUsers.User_ID/ComputerUsers.Computer_ID<->Software.Computer_ID

我知道我可以使用

SELECT * FROM Users INNER JOIN ComputerUsers ON Users.User_ID = ComputerUsers.User_ID INNER JOIN Software ON ComputerUsers.Computer_ID = Software.Computer_ID

将用户与他们的所有软件联系在一起,特别是如果我像这样过滤它

Where Users.User_ID = 'Some_Value'

我的抱怨是,当我运行这个 SQL 时,我得到一个包含以下内容的结果集: Users 表中的所有列、Computer_Users 表中的所有列以及软件表中的所有列。

我确信有更好的方法可以做到这一点,但我是 MySQL、SQL 和一般数据库方面的新手。

如何在省略 Computer_Users 表中的列的同时完成将用户表与软件表连接在一起?

【问题讨论】:

  • select 语句中明确列出列。那就是你想要的。另外,这是个好主意。
  • 速度快得吓人...另外,如果您想将其放入答案表格中,我会标记它。
  • 我们的目标是取悦 :P(而 Gordon 正力争在今年获得的积分中排名第一)

标签: mysql sql database join


【解决方案1】:

您可以这样做以仅从两个表中获取列:

SELECT u.*, s.*
FROM Users u INNER JOIN
     ComputerUsers cu
     ON u.User_ID = cu.User_ID INNER JOIN
     Software s
     ON cu.Computer_ID = s.Computer_ID;

更聪明的方法是使用using 子句:

SELECT *
FROM Users u INNER JOIN
     ComputerUsers cu
     USING (User_ID) INNER JOIN
     Software s
     USING (Computer_ID);

当您使用USING 时,用于join 条件的列不会重复。

【讨论】:

  • #2,我很喜欢。我想我要问的下一个问题是如何使用 LINQ to Data Set 在 .Net 中使用 3 个表来完成这项工作......
【解决方案2】:

您需要在查询的 SELECT 部分列出您想要的列,而不是使用 *.您可以按表格执行此操作:

SELECT Users.*, Software.*
FROM ...

或按列:

SELECT Users.UserName, Users.Login, Software.Title, Software.Version ...
FROM ...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-06-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多