sql从一个表中从另一个表中选择多个字段

roejwanj  于 2021-06-21  发布在  Mysql
关注(0)|答案(4)|浏览(317)

我正在尝试从一个表中选择另一个表中的一些字段。

table: services

+------+------+-------+----------+----------+----------+
| id_s | serv | id_ve | destiny1 | destiny2 | destiny3 |
+------+------+-------+----------+----------+----------+
|    1 |   25 |    1  |        3 |        4 |        5 |
|    2 |   27 |    3  |        2 |        3 |        5 |
|    3 |   35 |    1  |        5 |        3 |        1 |
|    4 |   39 |    2  |        2 |        1 |        5 |
+------+------+-------+----------+----------+----------+

table: destiny

+------+---------+
| id_d | destiny |
+------+---------+
|    1 |     UK  |
|    2 |     FR  |
|    3 |     PT  |
|    4 |     SP  |
|    5 |     NL  |
+------+---------+

table: vessel

+------+---------+
| id_v | vessel  |
+------+---------+
|    1 |  Icarus |
|    2 |   Creta |
|    3 |  Dedalo |
+------+---------+

我想要这样的结果:

+------+------+--------+----------+----------+----------+
| id_s | serv | vessel | destiny1 | destiny2 | destiny3 |
+------+------+--------+----------+----------+----------+
|    1 |   25 | Icaro  | PT       | SP       | NL       |
|    2 |   27 | Dedalo | FR       | PT       | NL       |
|    3 |   35 | Icaro  | NL       | PT       | UK       |
|    4 |   39 | Creta  | FR       | UK       | NL       |
+------+------+--------+----------+----------+----------+

我在试下一句话。。。

SELECT *
FROM `services`, `destiny`, `vessel`
WHERE `vessel`.`id_v' = `services`.`id_ve`
       AND `destiny`.`id_d` = `services`.`destiny1`
       AND `destiny`.`id_d` = `services`.`destiny2`
       AND `destiny`.`id_d` = `services`.`destiny3`
ORDER BY `services`.`id_s`

但我没有得到预期的结果。
你能帮忙吗。谢谢你的帮助。
谢谢

vkc1a9a2

vkc1a9a21#

根本原因是 WHERE 在下面的条件下,您将只加入destiny表一次,并将destiny表中的单个id与 services 这永远不会是真的-

AND `destiny`.`id_d` = `services`.`destiny1`
       AND `destiny`.`id_d` = `services`.`destiny2`
       AND `destiny`.`id_d` = `services`.`destiny3`

您需要为服务中的每个destiny列加入destiny表。顺便说一下,你用的是过时的 JOIN 语法,您应该使用新的语法ansi-92sql语法@错误\u 2346以正确的查询回答。

6pp0gazn

6pp0gazn2#

在那里 where 条件只限制结果的数量。您需要的是,像前面的答案一样,为每个连接添加更多连接 destinyX_id 与另一个有关。
这里有一把小提琴

select services.id_s, 
       services.serv, 
       vessel.vessel, 
       destiny1.destiny, 
       destiny2.destiny, 
       destiny3.destiny
from services
inner join vessel on vessel.id_v = services.id_ve
inner join destiny destiny1 on destiny1.id_d = services.destiny1
inner join destiny destiny2 on destiny2.id_d = services.destiny2
inner join destiny destiny3 on destiny3.id_d = services.destiny3;

请允许我这样说,以进一步发展你:这些名称公约是令人难以置信的可怕阅读。
命运表有一个命运字段。这是一个目的地,不是一个人的命运。
命运场意味着什么?坐标?名字?价值?地理位置?一些随机字符串?一个号码?不清楚
同样的命运也适用于船只
服务表-您可以设置单数或复数形式的表。你没有创造“容器”,你创造了“容器”。“命运”也是如此。为什么是“服务”?你认为什么是服务?
服务表具有id。什么是身份证?
服务表有destiny1、destiny2和destiny3。我们知道,它们是外键,但它们是外键这一点如何明确?为什么他们不按照你给id\u ve的结构说id\u destination?
这是一个体面的名称结构为您的表,请考虑它,以提高您的发展。
请允许我举例说明:
每个表都有自己的id。也就是说,当你看到id时,你就知道那是表的主键。当您有某个对象的id时,您就知道它是与某个对象的表主键相关的外键
每一个有外键的表,都有它们最可能的显式关系\u name\u key,并且在名称的末尾有id。
设置键后,放置所需的列,并将日期(创建时间、更新时间等)保留在末尾。
表和列的snake\u case\u
每张table都有各自的单数目的(或复数,个人喜好)。名为destination的表包含一组目的地。名为service的表包含服务列表。名为vessel的表包含容器列表。
为了将来的参考,您应该知道内部联接正在强制表之间的关系。如果 destinationservice 如果为null(列可为null),则不会得到结果。考虑检查左或右连接,以满足您的需要。https://www.w3schools.com/sql/sql_join.asp

vnjpjtjt

vnjpjtjt3#

您需要为服务器中的每个列加入destiny

SELECT s.id_s,
       s.serv,
       v.vessel,
       d1.destiny destiny1,
       d2.destiny destiny2,
       d3.destiny destiny3
  FROM services s
 INNER
  JOIN destiny d1
    ON s.distiny1 = d1.id_d
 INNER
  JOIN destiny d2
    ON s.distiny2 = d2.id_d
 INNER
  JOIN destiny d3
    ON s.distiny3 = d3.id_d
 INNER
  JOIN vessel v
    ON s.id_ve = v.id_v
x3naxklr

x3naxklr4#

您可以像这样使用左连接并获取结果

SELECT s.id_s,  s.serv,  v.vessel, d1.destiny destiny1, d2.destiny destiny2, d3.destiny destiny3
  FROM services s
 LEFT JOIN destiny d1
    ON s.distiny1 = d1.id_d
 LEFT JOIN destiny d2
    ON s.distiny2 = d2.id_d
 LEFT JOIN destiny d3
    ON s.distiny3 = d3.id_d
 LEFT JOIN vessel v
    ON s.id_ve = v.id_v;

相关问题