SQL从另一个表的表中选择多个字段

时间:2018-07-20 19:51:23

标签: mysql sql mariadb

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

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 个答案:

答案 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与另一个联接相关。

Here's a fiddle about it

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;
  

为了进一步发展您的语言,请允许我这样说:这些名称约定很难阅读。

  1. 目的地表具有目的地字段。这是目的地,而不是某人的命运。
  2. 命运领域意味着什么?坐标?名称?值?地理位置?一些随机的字符串?一个号码?不清楚
  3. 命运的同样情况适用于船只
  4. 服务表-您可以将表设置为单数或复数。您没有创建“容器”,而是创建了“容器”。与“命运”相同。为什么选择“服务”?您甚至认为服务是什么?
  5. 服务表具有id_ve。什么是id_ve?
  6. 服务表具有destiny1,destiny2,destiny3。我们知道它们是外键,但是如何明确显示它们是外键?他们为什么不遵循您赋予id_ve的相同结构并说出id_destination?

This is a decent name structure for your tables, please take consideration into it in order to improve your development.

请允许我举例说明

  1. 每个表都有自己的ID。意思是,当您看到id时,就知道那是表的主键。当您拥有something_id时,您就知道它是与某物的表主键相关的外键

  2. 每个具有外键的表都将具有其最可能的显式 在名称末尾带有id的relationship_name_key。

  3. 设置键后,将所需的列放置在底部,并保留日期(created_at_,updated_at等)。

  4. snake_case_for_tables_and_columns

  5. 每个表都应以其自己的单数目的(或复数,个人喜好)为准。名为destination的表包含许多目标。名为service的表包含服务列表。名为vessel的表包含容器列表。

  

供将来参考,您应该知道内部联接正在强制表之间的关系。如果destinationservice的字段之一为空(列可为空),则不会获得结果。考虑检查左联接或右联接,以满足您的需求。   https://www.w3schools.com/sql/sql_join.asp