Вопрос по запросу SQL

12 3
D
На сайте с 28.06.2008
Offline
1108
665

Пишу скрипт, сварганил запрос и понимаю что он мне немного не подходит. Вот что сваял.

SELECT t1.id,
t2.type_id,
t2.text
FROM firm_items as t1
INNER JOIN firm_items_fields_value as t2 on t1.id = t2.item_id
WHERE t1.category_id = 45

Результат такой


id type_id text
383 7 (495) 777-77-77
383 2 Иванов Петр Михайлович
383 6 site.ru
383 1 info@site.ru

И тут я понимаю что все равно придется делать лишние запросы в цикле.

А можно ли изменить запрос что бы результат был в виде

id tel dir site email
383 (495) 777-77-77 Иванов Петр Михайлович site.ru info@site.ru

Что-то типа

(t2.type_id = 7) as tel

(t2.type_id = 2) as dir

(t2.type_id = 6) as site

(t2.type_id = 1) as email

Можно как-то так?

ME
На сайте с 03.07.2017
Offline
66
#1

Либо сделайте доп таблицу в алиасами type_id, alias -> 7,tel и джойните ее.

Либо сделайте хардкод справочника алиасов на бэкенде и поставляйте алиас в результат вашего запроса

D
На сайте с 28.06.2008
Offline
1108
#2

Это нужно для разовой операции, т.е. быстро в пределах одного запроса никак?

ME
На сайте с 03.07.2017
Offline
66
#3
Dram:
Это нужно для разовой операции, т.е. быстро в пределах одного запроса никак?

Тогда на бэке подставляйте в в результат вашего запроса алиасы вместо id_type.

В рамках вашего запроса - не подскажу

S
На сайте с 19.11.2014
Offline
88
#4
Dram:


Можно как-то так?

Попробуйте так:

SELECT t1.id, t2.type_id, GROUP_CONCAT(t2.text SEPARATOR ' ')
FROM firm_items as t1
INNER JOIN firm_items_fields_value as t2 on t1.id = t2.item_id
WHERE t1.category_id = 45

Или почитайте про GROUP_CONCAT, у себя использую, нет времени сейчас искать. Наверное нужно ещё GROUP BY, или убрать из SELECT t2.type_id

edogs software
На сайте с 15.12.2005
Offline
775
#5

Dram,

group_concat , учитывая что уже вроде 3 раз на него в похожих ситуациях Вам же отвечаем, расписывать не будем:)

Разработка крупных и средних проектов. Можно с криптой. Разумные цены. Хорошее качество. Адекватный подход. Продаем lenovo legion в спб, дешевле магазинов, новые, запечатанные. Есть разные. skype: edogssoft
D
На сайте с 28.06.2008
Offline
1108
#6

Немного не то - все равно то поле куда все соберет group_concat придется распаршивать, а затем если мне нужно что-то будет обновить, я не буду знать ID этого поля.

Ну да ладно, не суть уже, я написал скрипт, + 1 запрос роли не сыграл.

S
На сайте с 19.11.2014
Offline
88
#7
Dram:
Немного не то - все равно то поле куда все соберет group_concat придется распаршивать, а затем если мне нужно что-то будет обновить, я не буду знать ID этого поля.
Ну да ладно, не суть уже, я написал скрипт, + 1 запрос роли не сыграл.

У Вас не запрос вида INSERT .... (SELECT), т.е. не сразу льёте выборку в базу - одним запросом из одной таблицы в другую? Если нет, то на том же php крутите как хотите результаты выборки, собирайте массивы по любым ключам, объединяйте поля, в каком хотите порядке

D
На сайте с 28.06.2008
Offline
1108
#8

Swir, так и сделал - просто вместо одного цикла пришлось писать второй. Думал обойтись одним...

S
На сайте с 19.11.2014
Offline
88
#9
Dram:
Swir, так и сделал - просто вместо одного цикла пришлось писать второй. Думал обойтись одним...

Если циклы без обращений к базе в каждой итерации, так чего их бояться.

D
На сайте с 28.06.2008
Offline
1108
#10

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

12 3

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий