Как я могу получить эти два пригорода с помощью SQL? - PullRequest
0 голосов
/ 28 апреля 2011

Я хочу получить пригород отправления и назначения в моем SQL.

SELECT jp.`id`,
     CONCAT(u.`first_name`, " ", u.`last_name`) AS `name`,
     jp.`departure_time`,
     jp.`destination_time`,
     s.`suburb` AS `departure_suburb`


FROM `journey_planning` AS `jp`
JOIN `users` AS `u` ON jp.`driver_id` = u.`id`
JOIN `suburbs` AS s ON jp.`departure_suburb_id` = s.`id`
  OR jp.`destination_suburb_id` = s.`id`

Как видите, есть departure_suburb_id и destination_suburb_id. Мне нужно, чтобы они сопоставились с их относительным значением в таблице suburbs.

На данный момент это возвращает две строки, обе с одинаковой информацией, кроме разного названия пригорода (однако оба, как departure_suburb, очевидно).

Я не эксперт по SQL, поэтому я не уверен, что мне следует делать. Я подумал об использовании подзапросов, но подумал, что, возможно, есть путь без них и избежание двух поисков.

Как мне изменить этот запрос, чтобы он возвращал то, чем он является сейчас, хотя departure_suburb и destination_suburb указывают на правильные значения в таблице suburbs?

Ответы [ 3 ]

3 голосов
/ 28 апреля 2011

Вам нужно присоединиться к таблице пригородов дважды, один раз для отъезда, один раз для пункта назначения.Также полезно знать тип используемого вами соединения, даже если подразумевается "INNER JOIN"!

SELECT jp.`id`,
     CONCAT(u.`first_name`, " ", u.`last_name`) AS `name`,
     jp.`departure_time`,
     jp.`destination_time`,
     s.`suburb` AS `departure_suburb`
     s2.`suburb` AS `destination_suburb` 

FROM `journey_planning` AS `jp`
JOIN `users` AS `u` ON jp.`driver_id` = u.`id`
JOIN `suburbs` AS s ON jp.`departure_suburb_id` = s.`id`
JOIN `suburbs` AS s2 ON jp.`destination_suburb_id` = s2.`id`
1 голос
/ 28 апреля 2011
SELECT
    jp.id
  , CONCAT(u.first_name, " ", u.last_name) AS name
  , jp.departure_time
  , jp.destination_time
  , dep.suburb AS departure_suburb
  , dest.suburb AS destination_suburb

FROM journey_planning AS jp
  JOIN users AS u 
    ON jp.driver_id = u.id
  JOIN suburbs AS dep 
    ON jp.departure_suburb_id = dep.id
  JOIN suburbs AS dest 
    OR jp.destination_suburb_id = dest.id

Как это можно сделать иначе?(Я бы не рекомендовал это для запроса с простыми JOIN, как у вас).Поскольку все отношения «один ко многим» со многими в таблице jp, это можно сделать так:

SELECT
    jp.id
  , CONCAT( ( SELECT first_name
              FROM users
              WHERE jp.driver_id = users.id
            )
          , " "
          , ( SELECT last_name
              FROM users
              WHERE jp.driver_id = users.id
            )
          )
      AS name
  , jp.departure_time
  , jp.destination_time
  , ( SELECT suburb
      FROM suburbs
      WHERE jp.departure_suburb_id = suburbs.id
    ) 
      AS departure_suburb
  , ( SELECT suburb
      FROM suburbs
      WHERE jp.destination_suburb_id = suburbs.id
    ) 
      AS destination_suburb

FROM journey_planning AS jp

Как видите, это становится довольно сложным, особенно когда выпоказать более одного поля из таблицы, например, имя и фамилию пользователей таблицы.

0 голосов
/ 28 апреля 2011

Просто снова ПРИСОЕДИНЯЙТЕСЬ к пригороду с другим псевдонимом таблицы:

SELECT jp.`id`,
    CONCAT(u.`first_name`, " ", u.`last_name`) AS `name`,
    jp.`departure_time`,
    jp.`destination_time`,
    departure_suburb.`suburb` AS `departure_suburb`,
    destination_suburb.`suburb` AS `destination_suburb`
FROM `journey_planning` AS `jp`
    JOIN `users` AS `u` ON jp.`driver_id` = u.`id`
    JOIN `suburbs` AS depart_suburb ON jp.`departure_suburb_id` = s.`id`
    JOIN `suburbs` AS destination_suburb ON jp.`destination_suburb_id` = ss.`id` 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...