【问题标题】:Using two columns with the same foreign key使用具有相同外键的两列
【发布时间】:2011-03-15 10:53:37
【问题描述】:

我有一个数据库,它有 5 个表,但我有问题。在出货表中,有两列,源和目的地,它们都是路由表的外键引用,但是当我从出货表中选择一条记录时,它只会显示相同的路由名称。

代码如下:

SELECT fare, commission, driver,shipment._date, routename, vehiclenumber, productname, source, destination, routename,ownername
FROM route, shipment, product, vehicle,owner
WHERE vehicle.vehicleid = shipment.vehicle
AND shipment.source
and vehicle.owner=owner.ownerid
AND shipment.destination = route.routeid
AND shipment.product = product.productid
AND vehicle.vehiclenumber =  'nk-234'
ORDER BY _date
LIMIT 0 , 30

【问题讨论】:

  • 你能更新一下SQL吗? “And shipping.source”似乎一无所获......
  • 学习使用 JOIN 表示法。

标签: mysql sql phpmyadmin


【解决方案1】:

要将一个表(一次装运)中的一条记录连接到另一张表(两条路线)中的多个记录,理想情况下,您最好对route 表使用显式JOINs 两次(或更多,无论有多少链接你碰巧需要)。

下面是对您的查询的快速修改,用于演示用法。特别注意SELECT中的两个routename列和FROMroute表的两个JOINs:

SELECT fare,
       commission,
       driver,
       shipment._date,
       RS.routename,    <-- field from first join
       vehiclenumber,
       productname,
       source,
       destination,
       RD.routename,    <-- field from second join
       ownername

FROM shipment
JOIN route RS ON RS.routeID = shipment.source       <-- join 1; source
JOIN route RD ON RD.routeID = shipment.destination, <-- join 2; destination
     product,
     vehicle,
     owner

WHERE vehicle.vehicleid = shipment.vehicle
  AND vehicle.owner = owner.ownerid
  AND shipment.product = product.productid
  AND vehicle.vehiclenumber =  'nk-234'

ORDER BY _date

LIMIT 0 , 30

显然,这可能不完全符合您的需求,因为我不知道其他选定字段来自哪些表,以便能够确保它们都被考虑在内...

【讨论】:

  • 严格来说,你可以完美地使用FROM route AS rs, route AS rd, ...,但是JOIN表示法更好。
  • 你不需要使用显式连接,尽管我同意它们读起来更好。
  • 好点。为了准确起见,我已经把措辞调低了。
【解决方案2】:

这是因为您在发货时从一行中选择字段,为了真正从您的外键中获得任何效果,您需要使用一些连接

http://dev.mysql.com/doc/refman/5.5/en/join.html

【讨论】:

    【解决方案3】:

    使用旧式(非首选)表示法,您可以编写:

    SELECT s.fare, s.commission, s.driver, s._date, v.vehiclenumber, p.productname,
           s.source, s.destination, rs.routename, rd.routename, o.ownername
      FROM route AS rs, route AS rd, shipment AS s, product AS p, vehicle AS v, owner AS o
     WHERE s.vehicleid = s.vehicle
       AND s.source = rs.routeid
       AND v.owner = o.ownerid
       AND s.destination = rd.routeid
       AND s.product = p.productid
       AND v.vehiclenumber =  'nk-234'
     ORDER BY _date
     LIMIT 0, 30
    

    我不得不猜测哪些表格包含票价、佣金和司机信息;我以为它们都在装运表中。

    在标准 SQL 中严格禁止使用下划线开始列名,尽管大多数 DBMS 都允许这样做。不过,它看起来很丑;为什么不使用“ship_date”作为列名?

    最好使用显式连接表示法,尤其是因为忘记连接条件的可能性较小:

    SELECT s.fare, s.commission, s.driver, s._date, v.vehiclenumber, p.productname,
           s.source, s.destination, rs.routename, rd.routename, o.ownername
      FROM shipment AS s
      JOIN route    AS rs ON s.source      = rs.routeid
      JOIN route    AS rd ON s.destination = rs.routeid
      JOIN vehicle  AS v  ON s.vehicleid   = s.vehicle
      JOIN owner    AS o  ON v.owner       = o.ownerid
      JOIN product  AS p  ON s.product     = p.productid
     WHERE v.vehiclenumber = 'nk-234'
     ORDER BY s._date
     LIMIT 0, 30
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-05-05
      • 1970-01-01
      • 2020-11-26
      • 2017-11-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-18
      相关资源
      最近更新 更多