【问题标题】:MySql query 2 records as 1 result [duplicate]MySql查询2条记录作为1个结果[重复]
【发布时间】:2018-01-18 18:16:28
【问题描述】:

我有一个表 address 和一个表 route

Route 存储了 Address 的 2 个 id 以及这些 Locations 之间的距离 -> idStartidEnddistance

+-------+-------+-----+--------+
|idRoute|idStart|idEnd|distance|
+-------+-------+-----+--------+
|0      |1      |3    |2698    |
|1      |2      |4    |914     |
+-------+-------|-----+--------+


+---------+---------+-------------+
|idAddress|country  |city         |
+---------+---------+-------------+
|0        |USA      |Indianapolis |
|1        |Brasil   |Rio          |
|2        |Germany  |Munich       |
|3        |Argentina|Buenos Aires |
|4        |Italy    |Rome         |
+---------+---------+-------------+

`

所以我想查询并获取所有路线如下:

+-------+-------+-------+--------+---------+------+------------+--------+
|idRoute|idStart|idEnd  |CountryS|CountryE |CityS |CityE       |distance|
+-------+-------+-------+--------+---------+------+------------+--------+
|0      |1      |3      |Brasil  |Argentina|Rio   |Buenos Aires|2698    |
|1      |2      |4      |Germany |Italy    |Munich|Rome        |914    |
+-------+-------+-------+--------+---------+------+------------+--------+

如果我做一些子查询和外部查询一个特定的路由 id,它会起作用,因为我有一个特定的 where id=#

       SELECT
            ro.idRoute,
            ro.idStart,
            ro.idEnd,
            ro.distance,
            ro.time,
            (select a.country from address a 
            left join route ro 
                on (a.idAddress=ro.idStart)
            WHERE ro.idRoute='.$id .') as country_start,
            (select a.country from address a 
            left join route ro 
                on (a.idAddress=ro.idEnd)
            WHERE ro.idRoute='.$id .') as country_end, FROM route ro
        LEFT JOIN address a ON (a.idAddress=ro.idStart)
        LEFT JOIN countries c ON (a.country=c.code)
        WHERE ro.idRoute='.$id . $this -> presetFilter . ';

但在大多数情况下,我需要所有路线记录,但我无法让它工作,因为对于子查询,我会错过 where 语句。

类似于外部查询->“set fieldname as outerResult”并在内部查询的where语句中使用outerResult????

【问题讨论】:

  • iguess idAdressidStartidEnd 匹配
  • 在您写的问题中,您有 2 个表,但查询有 3 个:那里还列出了一个国家/地区表。
  • 无论如何,这是一个重复的问题,因为您只需要加入地址表两次。也许国家/地区的表格也是两倍。
  • 这是一个想法。如果您改为存储坐标,那么您将自动获得对城市之间的距离!

标签: php mysql subquery


【解决方案1】:

您只需从路由表中加入两次地址:一次用于 IDstart,一次用于 IdEnd。这是通过使用表别名来完成的,因此您可以引用地址表两次,并且在加入或引用字段时,数据库引擎知道使用/需要对表的哪个引用。

SELECT r.IdRoute
     , r.idstart
     , r.idend
     , Start_Add.country as CountryS
     , End_Add.country CountryE
     , Start_Add.city as CityS
     , End_Add.city as CityE
     , r.distancce
FROM route r
INNER JOIN Address Start_Add
 on r.IDStart= Start_Add.IdAddress
INNER JOIN address End_Add
 on r.IDEnd= End_Add.IdAddress

【讨论】:

    猜你喜欢
    • 2020-03-25
    • 1970-01-01
    • 2011-07-11
    • 2020-09-30
    • 2019-10-21
    • 1970-01-01
    • 2013-08-10
    • 2015-02-07
    • 1970-01-01
    相关资源
    最近更新 更多