MySQL. Подстановка значений в таблицу из другой таблицы при запросе?

Не могу разобраться сразу с 2мя пунктами в запросе.


Задача — Дано 2 таблицы:

table1 (id, name, data1_id, data2_id, data3_id )

table2 ( id, data )

В таблице 2 указаны типы работ ( не в работе, в работе, выполнено )

В таблице 1 в поля data1...3_id мы указываем id типов работ из таблицы 2


Если у нас в таблице 1 всего одно поле в которое надо подставить значение из таблицы 2 — то запрос простой:

select *

from table1, table2

where table1.data_id = table2.id


Но у нас 3 поля надо заменить на значения из одной таблицы… Пока придумал только такое:

select table1.*, t1.data data1, t2.data data2, t3.data data3

from table1, table2 t1, table2 t2, table2 t3

where table1.data1_id = t1.id and table1.data2_id = t2.id and table1.data3_id = t3.id


Мне кажется это совсем криво подставлять одну таблицу трижды чтобы в 3 ячейки вставить значения из нее…


Ворая же облема в том, что в итоге я получаю таблицу с ужасным количеством столбцов которые дублируются… Ну вот скажем этот запрос вернет:

id, name, data1_id, data2_id, data3_id, data1, data2, data3

А ведь мне уже не нужны data_id пункты… Конечно в запросе можно указать не звездочку, а перечислить те поля что мне нужны. Но если выборка идет из таблицы где 20 полей, а надо всего 3 заменить и не показывать их — то перечисление всех 17ти оставшихся полей уже как то больше запроса будет размером…


В общем как оптимизирлвать запрос чтобы подставить в 3 разных ячейки таблицы данные из одной таблицы и как не показывать лишние поля без перечисления того что надо оставить...??
  • Вопрос задан
  • 49037 просмотров
Пригласить эксперта
Ответы на вопрос 4
AmdY
@AmdY
PHP и прочие вебштучки
Вам нужно почитать про джойны в доке мускула и вот неплохая вроде статья из поиска anton-pribora.ru/articles/mysql/mysql-join/
Ну и, соотвествтенно, подджойнить таблицу несколько раз используя алиасы.
Ответ написан
wartur
@wartur
Не берите за ответ. Но легче явно указывать какие поля выбирать. Это экономит трафик, это понятнее, это не даст появиться непредсказуемым результатам — например новому значению в выборке, при добавлении нового столбца.

Вопрос очень трудный в описании. По началу я просто думал что вы объединяете одну и ту же таблицу по разным параметрам (аля постройка дерева через айдишники). Потом понял что просто вы не хотите иметь что то типа этого оператора SELECT *, EXCEPT pole FROM bla bla bla

На сколько я знаю, такого оператора в SQL нет. Надеюсь помог + я описал свое мнение почему звездочкой пользоваться нехорошо.
Ответ написан
@AlexeyVD
Вообще в данной задаче логичнее было бы использовать структуру со связью «много ко многим». И не пришлось бы изобретать сейчас костыли.
Ответ написан
Комментировать
pudz
@pudz
Почитайте тут: scabbiaza.net/innodb.html

Хорошо расписано. Только там есть не большая опечатка при создании таблицы "orders".

Вместо предлагаемого им кода используйте:

CREATE TABLE `orders`(
ordid INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
userid INT(10) UNSIGNED NOT NULL,
prodid INT(10) UNSIGNED NOT NULL,
PRIMARY KEY (ordid),

INDEX (userid), # Для работы данного примера необходимо
INDEX (prodid), # добавить Индекса к следующим полям, иначе связки не будет

FOREIGN KEY (userid) REFERENCES users(userid)
ON UPDATE CASCADE
ON DELETE RESTRICT,
FOREIGN KEY (prodid) REFERENCES products(prodid)
ON UPDATE RESTRICT
ON DELETE CASCADE
) Engine = InnoDB
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы