Использование двух столбцов с одинаковым внешним ключом - PullRequest
0 голосов
/ 15 марта 2011

У меня есть база данных, в которой есть 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

Ответы [ 3 ]

3 голосов
/ 15 марта 2011

Чтобы связать запись в одной таблице (одна отправка) с более чем одной записью в другой таблице (двумя маршрутами), в идеале вы должны использовать явные JOIN s против таблицы route дважды (или более, для скольких ссылок) вам случается нуждаться).

Вот быстрая модификация вашего запроса, которая демонстрирует использование. Обратите особое внимание на два столбца routename в SELECT и два JOIN в таблице route в FROM:

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

Очевидно, что это может не совсем соответствовать вашим потребностям, потому что я не знаю, из каких таблиц взяты другие выбранные поля, чтобы иметь возможность убедиться, что все они учтены ...

1 голос
/ 15 марта 2011

Используя нотацию в старом стиле (не предпочтительно), вы можете написать:

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 строго запрещено, хотя большинство СУБД допускают это. Это выглядит некрасиво, хотя; почему не '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
1 голос
/ 15 марта 2011

Это потому, что вы выбираете поля из одной строки в отправке, или, чтобы получить эффект от внешних ключей, вам нужно использовать несколько объединений

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...