Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Скриптовые языки программирования > PHP
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 20.09.2013, 12:44   #1
Mortimoro
Форумчанин
 
Регистрация: 03.12.2010
Сообщений: 334
По умолчанию SQL-запрос, три одинаковые таблицы

Есть три таблицы, с абсолютно одинаковой структурой, но данными на разных языках. При выполнении запроса:
Код:
SELECT * FROM maintable m 
LEFT JOIN info_ru ru ON m.id=ru.id 
LEFT JOIN info_en en ON m.id=en.id 
LEFT JOIN info_de de ON m.id=de.id
формируется результат в виде:
Код:
array
  'id' => string '4314' (length=4)
  'name' => string 'тест' (length=4)
  'text' => string 'описание (deutch)' (length=17)
то есть, в переменную 'text' помещается значение из последней таблицы 'info_de'.

Как проще всего изменить запрос, чтоб на выходе получить результат из всех трех таблиц?

Будет идеально, если удастся получить что-то вроде:
Код:
array
  'id' => string '4314' (length=4)
  'name' => string 'тест' (length=4)
  'text_ru' => string 'описание (русский)' (length=18)
  'text_en' => string 'описание (english)' (length=18)
  'text_de' => string 'описание (deutch)' (length=17)
PS: перечислять каждое поле не хотелось бы, ибо на самом деле их не три, а около двух десятков.
Mortimoro вне форума Ответить с цитированием
Старый 20.09.2013, 13:24   #2
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
PS: перечислять каждое поле не хотелось бы, ибо на самом деле их не три, а около двух десятков.
не ленитесь и не морочьте себе голову, перечисляйте поля, давая нужные псевдонимы:
Код:
SELECT m.*, 
  ru.text as text_ru,
  en.text as text_en,
  de.text as text_de 
и т.д.
 FROM maintable m 
LEFT JOIN info_ru ru  ...
LEFT JOIN info_en en ...
и т.д.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 20.09.2013, 14:14   #3
Mortimoro
Форумчанин
 
Регистрация: 03.12.2010
Сообщений: 334
По умолчанию

Serge_Bliznykov, в каждой таблице около 20-30 полей, то есть для трех таблиц надо описать 60-90 полей - это как минимум некрасиво будет выглядеть в запросе...

Дело в том, что сам запрос я формирую динамически, то есть когда надо будет добавить еще французский язык, мне достаточно добавить запись о французском языке в конфигурацию и скопировать структуру таблицы из любой info в info_fr, а дальше переводчик будет сидеть все заполнять.

Для того, чтоб добавить перечисление, мне нужно дополнительно создавать список полей в таблице... если через год-два надо будет добавить новое поле, то вместо того, чтоб просто добавить его в таблице и объявить в представлении, я буду сидеть вспоминать где я его еще прописывал в контроллере или конфигурации - это лишняя работа.

Могу конечно получать список полей из information_schema, но лишний запрос ради моего личного удобства в данном случае неоправдан.

Если никто не предложит решение на основе грамотного и красивого запроса, я лучше в каждой таблице поля переименую на text_ru, text_en, text_de и схема останется простой и прозрачной.
Mortimoro вне форума Ответить с цитированием
Старый 20.09.2013, 18:43   #4
Johnatan
Antimoderаtoris
Участник клуба
 
Регистрация: 08.02.2008
Сообщений: 1,251
По умолчанию

Mortimoro
Это задача серверного языка программирования, а не SQL.
У меня, например, есть таблица с текстами и переводами, а вместо полей для текста указан id.
ActiveRecord модель расширена до MultilingualAcriveRecord, где автоматом достаются поля с текстом на нужном языке. Делается это через JOIN-ы

Таблица translations
Код:
id, language, message
Таблица например Products
Код:
id, name_id, description_id, value, ...
где name_id и description_id указывают на таблицу translations

Получается запрос
Код:
SELECT `products`.*, `translations_name`.`message` `name`, `translations_description`.`message` `description` FROM `products` LEFT OUTER JOIN `translations` `translations_name` ON (`products`.`name_id` = `translations_name`.`id`) AND (`translations_name`.`language`='ru') LEFT OUTER JOIN `translations` `translations_description` ON (`products`.`description_id` = `translations_description`.`id`) AND (`translations_description`.`language`='ru') WHERE `product`.`id` = 1
Некрасиво? Зато хорошо работает, быстро, надёжно, кешируемо, добавление языка происходит ОДНИМ изменением в ОДНОМ конфигурационном файле, добавление нового поля происходит ОДНИМ изменением в конфигурации MultilingualActiveRecord. У вас 30 мультиязычных полей в одной модели? Тогда вам скорее всего прийдётся делать одну строку всей модели на один язык. Хотя такая система будет работать даже с 30 мультиязычными полями. Но кеширование - must-have.
98% из тысячи моих постов сделаны в профильном подфоруме. Я не накручиваю свои посты болтанием в "курилке", а ты?
Johnatan вне форума Ответить с цитированием
Старый 20.09.2013, 19:11   #5
Mortimoro
Форумчанин
 
Регистрация: 03.12.2010
Сообщений: 334
По умолчанию

Johnatan, а вот это уже действительно интересно. Спасибо.
Mortimoro вне форума Ответить с цитированием
Старый 20.09.2013, 23:39   #6
ADSoft
Старожил
 
Регистрация: 25.02.2007
Сообщений: 4,160
По умолчанию

как вариант - тупо все поля
Код:
SELECT ru.*,en.*, de.* FROM maintable m 
LEFT JOIN info_ru ru ON m.id=ru.id 
LEFT JOIN info_en en ON m.id=en.id 
LEFT JOIN info_de de ON m.id=de.id
ADSoft вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Найти степень числа N, у которой три последние цифры одинаковые. Vika_0_0 Паскаль, Turbo Pascal, PascalABC.NET 7 11.03.2012 10:24
Sql запрос. Из одной таблицы два раза templton SQL, базы данных 2 20.04.2011 17:47
Удаление данных из таблицы через SQL запрос Kity19 БД в Delphi 2 19.01.2011 23:35
SQL-запрос (связанные таблицы) astra-48 БД в Delphi 3 03.03.2010 01:44
SQL запрос сразу по двум столбцам одной таблицы Иван БД в Delphi 6 03.01.2008 14:36