我正在尝试从一个表中选择另一个表中的某些字段。
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`
但是我没有得到预期的结果。
请您帮忙。您的帮助将不胜感激。
谢谢
答案 0 :(得分:0)
您需要加入服务器中每一列的命运
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
答案 1 :(得分:0)
您可以使用左连接并这样获取结果
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;
答案 2 :(得分:0)
根本原因是下面的WHERE
条件,您只连接了一次命运表,并将命运表中的单个ID与services
的三个不同列进行比较,这将永远不会成立-
AND `destiny`.`id_d` = `services`.`destiny1`
AND `destiny`.`id_d` = `services`.`destiny2`
AND `destiny`.`id_d` = `services`.`destiny3`
您需要为服务中的每个命运列加入命运表。顺便说一句,您正在使用过时的JOIN
语法,应该使用新的语法ANSI-92 SQL syntax。 @ Error_2346用正确的查询回答了。
答案 3 :(得分:0)
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。意思是,当您看到id时,就知道那是表的主键。当您拥有something_id时,您就知道它是与某物的表主键相关的外键
每个具有外键的表都将具有其最可能的显式 在名称末尾带有id的relationship_name_key。
设置键后,将所需的列放置在底部,并保留日期(created_at_,updated_at等)。
snake_case_for_tables_and_columns
每个表都应以其自己的单数目的(或复数,个人喜好)为准。名为destination的表包含许多目标。名为service的表包含服务列表。名为vessel的表包含容器列表。
供将来参考,您应该知道内部联接正在强制表之间的关系。如果
destination
中service
的字段之一为空(列可为空),则不会获得结果。考虑检查左联接或右联接,以满足您的需求。 https://www.w3schools.com/sql/sql_join.asp