MySQL запрос - более элегантный вариант? Ссылка на одно и то же имя столбца в нескольких таблицах в SELECT - PullRequest
0 голосов
/ 18 января 2019

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

Так, например, таблицы (bnsf, train_plan, train_type и operation_costs) будут ALL иметь поле с именем ' train_id '.

В зависимости от записи / строки значение в столбце train_id может быть равно 1, 2, 3, 4, 5 и т. Д. Но в большинстве случаев в запросе все желаемые результаты будут для записей. где эти значения соответствуют заданному значению, например « 2 ».

Итак, такой запрос работает:

SELECT * FROM (((bnsf
INNER JOIN train_plan ON bnsf.train_id = train_plan.train_id)
INNER JOIN train_type ON train_plan.train_id = train_type.train_id)
INNER JOIN operation_costs ON train_type.train_id = operation_costs.train_id)
WHERE bnsf.train_id = 2
 AND train_plan.train_id = 2
 AND train_type.train_id = 2
 AND operation_costs.train_id = 2;

Есть ли более простой способ написания этого запроса (в частности, ГДЕ пункт)? По сути, что-то вроде этого:

WHERE `train_id` IN TABLE(bnsf, train_plan, train_type, operation_costs) = 2;
// invalid syntax

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

Я потратил много времени на чтение других постов, но мне не нравятся предложения с профсоюзами и т. Д. (Кажется, не короче)

1 Ответ

0 голосов
/ 18 января 2019

Ваши условия объединения делают все, кроме первых предложений WHERE, излишними.

INNER JOIN train_plan ON bnsf.train_id = train_plan.train_id)

Выбираются только train_plan строки, соответствующие bnsf.train_id, и аналогично для другие таблицы соединились дальше.

Итак, когда вы говорите,

WHERE bnsf.train_id = 2

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

SELECT * FROM (((bnsf
INNER JOIN train_plan ON bnsf.train_id = train_plan.train_id)
INNER JOIN train_type ON train_plan.train_id = train_type.train_id)
INNER JOIN operation_costs ON train_type.train_id = operation_costs.train_id)
WHERE bnsf.train_id = 2

Это вполне разумный запрос.

...