2013-04-11 3 views
2

У меня есть четыре стола: Couriers, Cars, Planes и Boats.Найти таблицу mysql по соответствующей записи

Курьеры таблица имеет столбцы, как: цена, место назначения и т.д.

Последние три таблицы разные типы курьеров с различными столбцами собственно к типу курьера (например, машины имеет цилиндры столбцов). Однако все четыре таблицы имеют столбец IdCourier, который связывает тип курьера (и его свойств) с его ценой, пунктом назначения и т. Д.

Я знаю IdCourier курьера и хочу узнать его цену и узнать, это автомобиль, самолет или лодка.

Какой запрос Mysql использовать?

Имеет ли смысл эта структура таблиц?

+0

Возможно ли, что 'IdCourier' будет дублироваться в' Cars', 'Planes' или' Boats' (т. Е. Автомобиль и лодка)? –

+0

Нет, это не дублируется. –

+0

В таблицах Cars, Planes and Boats есть столбец, который идентифицирует тип курьера. Или есть такая колонка в таблице Курьеров? – Melanie

ответ

1

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

SELECT `price`, 'car' as `mytype` 
FROM Couriers 
JOIN Cars ON (Couriers.Id = Cars.IdCourier) 
WHERE Cars.IdCourier = ? 

UNION 

SELECT `price`, 'plane' as `mytype` 
FROM Couriers 
JOIN Planes ON (Couriers.Id = Planes.IdCourier) 
WHERE Planes.IdCourier = ? 

UNION 

SELECT `price`, 'boat' as `mytype` 
FROM Couriers 
JOIN Boats ON (Couriers.Id = Boats.IdCourier) 
WHERE Boats.IdCourier = ?; 

Но это довольно дорого. Вместо этого я лично создал бы пятый стол под названием CouriersTypes с полями IdCourier, IdType и Тип. Индекс IdCourier для быстрого поиска. В этом примере предполагается, что курьер может соответствовать любому ИЛИ всех типов (автомобиль, самолет, лодка). Теперь ваш запрос становится:

SELECT `price`, `Type` 
FROM Couriers 
JOIN CouriersTypes ON (Couriers.Id = CouriersTypes.IdCourier) 
WHERE IdCourier = ?; 

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

SELECT `price`, `Type` 
FROM Couriers 
WHERE Id = ?; 

Надеюсь, это поможет.

+0

Пойду с последним вариантом. Благодарю. –

0

Структура имеет смысл. Тип запроса будет зависеть от того, что вы планируете делать с данными.

Если вы хотите получить конкретный автомобиль из автомобилей вы бы использовать что-то вроде:

SELECT * FROM Courier INNER JOIN Cars ON Cars.IdCourier = Courier.IdCourier WHERE Courier.IdCourier = ?

Вы всегда псевдоним таблиц, чтобы облегчить синтаксис для записи. Кроме того, предложение WHERE будет использоваться, только если вы хотите ВЫБРАТЬ конкретную запись.

Если вы можете опубликовать инструкции create table, это поможет.

+0

Проблема в том, что я не знаю, является ли мой курьер автомобилем. У меня есть только IdCourier и вы хотите знать, что это за курьер. –

+0

В таблицах с машинами, лодками и планшетами одинаковое количество столбцов? Если это так, вы можете присоединиться к подзапросу, который использует объединение для таблиц Cars, Boats и Planes, чтобы объединить их и присоединиться к таблице Courier. Единственная проблема заключается в том, что вы не знаете, из какой таблицы пришел ваш результат. –

+0

Они не имеют одинакового количества столбцов. –

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