2015-08-21 1 views
0

Я пытаюсь написать запрос, чтобы объединить данные из трех таблиц:MySQL-запрос с тремя таблицами, с одной ссылкой и с одинаковыми полями. Какой лучший подход?

--------------------------------- 
| destinations    | 
--------------------------------- 
| id | city  | status | 
--------------------------------- 
| 1  | Milan  | Open  | 
| 2  | Florence | Open  | 
| 3  | Venice  | Open  | 
--------------------------------- 


--------------------------------- 
| trips      | 
--------------------------------- 
| id | from | to | train | 
--------------------------------- 
| 1  | 1  | 2  | 2  | 
| 2  | 1  | 2  | 3  | 
| 3  | 2  | 1  | 2  | 
| 4  | 2  | 3  | 2  | 
| 5  | 1  | 3  | 1  | 
| 6  | 3  | 1  | 1  | 
--------------------------------- 


--------------------------------- 
| trains      | 
--------------------------------- 
| id | train     | 
--------------------------------- 
| 1  | T1     | 
| 2  | ChooChoo    | 
| 3  | IC123     | 
--------------------------------- 

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

Что-то вдоль этих линий:

----------------------------------------------------------------- 
|   Query: all trains going to/from Florence    | 
----------------------------------------------------------------- 
| trips.id | from.id | from (city) | to.id | to. city | train | 
----------------------------------------------------------------- 
| 1  | 1  | Milan  | 2  | Florence | 2  | 
| 2  | 1  | Milan  | 2  | Florence | 3  | 
| 3  | 2  | Florence | 1  | Milan  | 2  | 
| 4  | 2  | Florence | 3  | Venice  | 2  | 
----------------------------------------------------------------- 

Проблема, с которыми я столкнулся, по существу два: автоматические ссылками таблица назначения (которые я могу легко решить с псевдонимами) и тот факт, что я пытаюсь объединить два набора данных из двух разных выборок (которые я думал о решении с временными таблицами).

Теперь все хорошо, если бы не колонны с одинаковыми именами. Поскольку я хочу сохранить «идентификаторы» в моей временной таблице (для использования со ссылками), я не могу создать временную таблицу с подстановочным знаком (например, SELECT * FROM), но мне нужно было бы указать все столбцы и напишите чудовищный запрос. Он будет работать, но он не будет гибким, и если я добавлю другие столбцы в будущем, это будет ад, обновляющий его!

Может ли любой гуру MySQL, возможно, предложить лучший подход, пожалуйста?

Спасибо и приветствую вас из Австралии.

+0

извините, но я не получаю, Что неправды с «Командировки левой присоединиться к адресаты б на (а .from = b.id) .... " – user5224389

+0

(Хотя я знаю, что вы находите 100 примеров на SO, где я этого не делал ...) Вы всегда должны указывать столбцы в SELECT. Если вы не можете этого сделать, это обычно указывает на недостаток дизайна. – Strawberry

+0

Хорошая точка @Strawberry Возможно, мне стоит рассмотреть дизайн, хотя простота этого примера (и вашего решения) заставляет меня думать, что это уже не так уж плохо. Еще раз спасибо. –

ответ

0

G'day ...

DROP TABLE IF EXISTS destinations; 

CREATE TABLE destinations 
(city_id INT NOT NULL AUTO_INCREMENT PRIMARY KEY 
,city VARCHAR(12) NOT NULL UNIQUE 
,status VARCHAR(12) NOT NULL 
); 

INSERT INTO destinations VALUES 
(1,'Milan','Open'), 
(2,'Florence','Open'), 
(3,'Venice','Open'); 

DROP TABLE IF EXISTS trips; 

CREATE TABLE trips 
(trip_id INT NOT NULL AUTO_INCREMENT PRIMARY KEY 
,from_city_id INT NOT NULL 
,to_city_id INT NOT NULL 
,train INT NOT NULL 
,UNIQUE(from_city_id,to_city_id,train) 
); 

INSERT INTO trips VALUES 
(1,1,2,2), 
(2,1,2,3), 
(3,2,1,2), 
(4,2,3,2), 
(5,1,3,1), 
(6,3,1,1); 

DROP TABLE IF EXISTS trains; 

CREATE TABLE trains 
(train_id INT NOT NULL AUTO_INCREMENT PRIMARY KEY 
,train VARCHAR(12) NOT NULL UNIQUE 
); 

INSERT INTO trains VALUES 
(1,'T1'), 
(2,'ChooChoo'), 
(3,'IC123'); 

SELECT * FROM destinations; 
+---------+----------+--------+ 
| city_id | city  | status | 
+---------+----------+--------+ 
|  1 | Milan | Open | 
|  2 | Florence | Open | 
|  3 | Venice | Open | 
+---------+----------+--------+ 

SELECT * FROM trips; 
+---------+--------------+------------+-------+ 
| trip_id | from_city_id | to_city_id | train | 
+---------+--------------+------------+-------+ 
|  1 |   1 |   2 |  2 | 
|  2 |   1 |   2 |  3 | 
|  5 |   1 |   3 |  1 | 
|  3 |   2 |   1 |  2 | 
|  4 |   2 |   3 |  2 | 
|  6 |   3 |   1 |  1 | 
+---------+--------------+------------+-------+ 

SELECT * FROM trains; 
+----------+----------+ 
| train_id | train | 
+----------+----------+ 
|  2 | ChooChoo | 
|  3 | IC123 | 
|  1 | T1  | 
+----------+----------+ 

SELECT t.trip_id 
    , t.from_city_id 
    , from_city.city 
    , t.to_city_id 
    , to_city.city 
    , t.train 
    FROM trips t 
    JOIN destinations from_city 
    ON from_city.city_id = t.from_city_id 
    JOIN destinations to_city 
    ON to_city.city_id = t.to_city_id 
WHERE 'Florence' IN(from_city.city,to_city.city); 
+---------+--------------+----------+------------+----------+-------+ 
| trip_id | from_city_id | city  | to_city_id | city  | train | 
+---------+--------------+----------+------------+----------+-------+ 
|  3 |   2 | Florence |   1 | Milan |  2 | 
|  4 |   2 | Florence |   3 | Venice |  2 | 
|  1 |   1 | Milan |   2 | Florence |  2 | 
|  2 |   1 | Milan |   2 | Florence |  3 | 
+---------+--------------+----------+------------+----------+-------+ 
+0

Спасибо за это, я не думал переписывать запрос с несколькими объединениями + OR с помощью IN(). Простой и блестящий. –

0

при создании отчета обычно не рекомендуется использовать SELECT *, , потому что, когда я изменяю таблицу, отчет может показывать неправильный результат.

Обычно я предпочитаю писать поле id с id_content, например. id_destination, id_to, id_train, ЕСС ...

SELECT trips.id, f.id, f.city, t.id, t. city, trains.train 
FROM trips trips 
INNER JOIN destinations f 
ON trips.from = f.id 
INNER JOIN destinations t 
ON trips.from = t.id 
INNER JOIN trains trains 
ON trips.train = trains.id 
ORDER BY 1 ASC 
+0

Спасибо Stamprsist. Мне тоже нравится эта идея (и, похоже, я пойду по этому пути). –

 Смежные вопросы

  • Нет связанных вопросов^_^