首页 > 解决方案 > 从许多不同的表中选择并加入

问题描述

我需要组合来自不同表的几个不同的列。这些都列在这里。我似乎无法正确使用语法。我是初学者,请耐心等待!

这些表是“report”、“mission”和“hist_unit”,以下值相同

mission.id = report.mission_id
hist_unit.id = report.deployed_unit_id

沿着这些路线尝试了一些东西

    SELECT
mission_id AS mission_id,
deployed_unit_id AS depl_unit_id,
accepted AS accepted,
character_id AS character_id,
pilot_status AS pilot_status
FROM report

id AS depl_unit_id
faction AS faction
FROM hist_unit

mission.id AS mission_id
hist_date AS hist_date
FROM mission

我希望这个查询做的是将上面显示的列放在一起,并检查顶部显示的值是否相互对应。然后我希望它只显示派系 = 3 和接受 = 1 的行。然后我希望它只显示条目

WHERE hist_date BETWEEN '1941-11-15 00:00:00.000' AND '1942-04-15 23:59:59:999'

输出应该是这样的

mission_id,depl_unit_id,faction,character_id,pilot_status,accepted,hist_date

标签: mysql

解决方案


像这样的东西:

 SELECT r.id                   AS report_id
      , r.mission_id           AS mission_id
      , r.deployed_unit_id     AS depl_unit_id
      , r.accepted             AS accepted
      , r.character_id         AS character_id
      , r.pilot_status         AS pilot_status

      , h.id                   AS h_depl_unit_id
      , h.faction              AS faction

      , m.id                   AS m_mission_id

   FROM report r

   JOIN hist_unit h
     ON h.id = r.deployed_unit_id

   JOIN mission m
     ON m.id  = r.mission_id

 WHERE h.hist_date  >= '1941-11-15' 
   AND h.hist_date  <  '1942-04-15' + INTERVAL 1 DAY
   AND h.faction    =  3
   AND r.accepted   =  1

 ORDER 
    BY r.id
     , r.mission_id 

在 SELECT 关键字之后,列出要返回的所有表达式。

FROM子句引用表。多个表应该由 JOIN 关键字分隔,然后是一个ON子句。(INNER 关键字不是必需的;CROSS 关键字不是必需的,但可以在没有连接条件时包含,以帮助以后的读者;外部连接需要添加LEFT(或RIGHT关键字)。

考虑为每个表引用分配一个别名。

使用分配的表别名(或表名称,如果未分配别名)限定所有列引用。

AS column_nameSELECT 列表中的列省略时,将使用列名。例如,我们可以省略AS accepted并且第四列仍然会接受名称。

避免返回具有健全名称的多个列。这样做并不违法,但请考虑将列别名(结果集中的列名)修改为唯一。即depl_unit_id可以重命名其中一列。


在比较范围内的日期时间值时,强烈考虑使用>=<比较。不要试图以小于或等于23:59:59.999......如果精度是微秒,我们会留下一个小差距。让我们避免差距,只做一个“小于”第二天的午夜,我们要排除的第一个日期时间值。(是的,我们必须指定列名/表达式两次,每次比较一次,因为没有BETWEEN_GE_LT比较运算符可以用“小于”比较代替运算符的“小于或等于”比较BETWEEN。这是一个小为更明确准确地表达我们试图实现的目标而付出的代价。


推荐阅读