我正在尝试从一个表中选择另一个表中的一些字段。
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`
但我没有得到预期的结果。
你能帮忙吗。谢谢你的帮助。
谢谢
4条答案
按热度按时间vkc1a9a21#
根本原因是
WHERE
在下面的条件下,您将只加入destiny表一次,并将destiny表中的单个id与services
这永远不会是真的-您需要为服务中的每个destiny列加入destiny表。顺便说一下,你用的是过时的
JOIN
语法,您应该使用新的语法ansi-92sql语法@错误\u 2346以正确的查询回答。6pp0gazn2#
在那里
where
条件只限制结果的数量。您需要的是,像前面的答案一样,为每个连接添加更多连接destinyX_id
与另一个有关。这里有一把小提琴
请允许我这样说,以进一步发展你:这些名称公约是令人难以置信的可怕阅读。
命运表有一个命运字段。这是一个目的地,不是一个人的命运。
命运场意味着什么?坐标?名字?价值?地理位置?一些随机字符串?一个号码?不清楚
同样的命运也适用于船只
服务表-您可以设置单数或复数形式的表。你没有创造“容器”,你创造了“容器”。“命运”也是如此。为什么是“服务”?你认为什么是服务?
服务表具有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的表包含容器列表。
为了将来的参考,您应该知道内部联接正在强制表之间的关系。如果
destination
在service
如果为null(列可为null),则不会得到结果。考虑检查左或右连接,以满足您的需要。https://www.w3schools.com/sql/sql_join.aspvnjpjtjt3#
您需要为服务器中的每个列加入destiny
x3naxklr4#
您可以像这样使用左连接并获取结果