0 / 0 / 0
Регистрация: 14.01.2013
Сообщений: 17
1

Как использовать один запрос вместо двух?

19.08.2016, 13:53. Показов 431. Ответов 5
Метки нет (Все метки)

В CMS есть различные типы внутренних объектов.

У каждого объекта есть основные поля, общие для всех объектов (таблица objects). И дополнительные поля (таблица content).

Столбцы таблицы objects есть поля объекта, тут все просто: objects(id, name,..., updated, created)

Столбцы же таблицы content имеют фиксированные названия: content (oid, field, value), в столбце field хранится дополнительное поле, а в value -- его значение.

Соответственно, при выборе по id из objects результатом запроса является строка, а при выборе из content -- таблица, где столбец oid повторяется:
oid field value
3 mail [BLOB - 28 Байт]
3 fio [BLOB - 16 Байт]
3 date [BLOB - 10 Байт]
3 ip [BLOB - 13 Байт]

Можно ли при выборе всех полей объекта использовать всего один запрос (а не выбирать сначала основные поля, а потом дополнительные)? Хочу в ответе получать строку, а не таблицу.
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
19.08.2016, 13:53
Ответы с готовыми решениями:

Использовать один блок try{} вместо двух, сохраняя производительность
LeniumSoft, а как бы вы переработали вот этот метод? Как видите, тут я кучу блоков try{} тоже...

Связанный список - использовать в функции один указатель вместо двух
Возможно ли использовать в этой функции один указатель вместо двух (*cur и *prev) ? #include...

Jugged (ступенчатые) массивы: Вместо двух циклов for использовать один foreach
Приветствую. В одном из курсов по программированию на C# есть тема про ступенчатые массивы. В...

Как использовать один Enum в двух проектах по связной ссылке?
Такая ситуация есть два проекта в одном решении, первый собирается в DLL, второй в EXE, в одном и...

5
340 / 236 / 113
Регистрация: 12.05.2016
Сообщений: 642
19.08.2016, 17:52 2
Канеш можно, для этого SQL и придумали, почитайте на досуге про соединения таблиц aka JOIN-ы


SQL
1
2
3
4
5
6
7
8
9
SELECT o.id, o.name
, MAX(CASE WHEN c.field='mail' THEN c.value ELSE '' END) mail
, MAX(CASE WHEN c.field='fio'  THEN c.value ELSE '' END) fio
, MAX(CASE WHEN c.field='date' THEN c.value ELSE '' END) DATE
, MAX(CASE WHEN c.field='ip'   THEN c.value ELSE '' END) ip
FROM  objects o
LEFT JOIN content c ON c.oid = o.id
WHERE o.id = 1
GROUP BY o.id, o.name
0
0 / 0 / 0
Регистрация: 14.01.2013
Сообщений: 17
19.08.2016, 20:24  [ТС] 3
С джойнами знаком, конструкция MAX....GROUP BY тоже вроде понятна.

А вот о добавлении произвольных полей в запрос я и не подозревал:
SQL
1
SELECT *, "Pepperoni" pizza FROM `objects` WHERE id=1
А что делать в случае, если мы хотим выбрать все поля объекта, но заранее не знаем как они называются, т.е. неизвестно, что написано в content.field?
0
340 / 236 / 113
Регистрация: 12.05.2016
Сообщений: 642
20.08.2016, 10:48 4
Если набор полей у вас заранее неопределён, то разворачивать в строку не имеет практического смысла.

Как вы потом собираетесь эту строку использовать?
На клиенте ГОРАЗДО проще получить нормальный построчный дата сет из таблицы с полями для объекта и обработать его в цикле. Чем городить огород с неизвестного размера строкой, да плюс еще с неизвестными названиями колонок.

Это теоретически можно сделать собрав динамический запрос в хранимке, но непонятен конечный бизнес кейс использования полученных данных.
0
0 / 0 / 0
Регистрация: 14.01.2013
Сообщений: 17
20.08.2016, 12:46  [ТС] 5
У меня так и сделано:
PHP
1
mysql_query('SELECT * FROM objects WHERE objects.id="'.$id.'" LIMIT 1')
а затем, в случае успеха:
PHP
1
mysql_query('SELECT field, value FROM content WHERE oid="'.$id.'"');
Подумал, вдруг существует более красивое и элегантное решение.
0
1312 / 944 / 144
Регистрация: 17.01.2013
Сообщений: 2,348
22.08.2016, 12:48 6
Streuner, GROUP_CONCAT вам в помощь
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
22.08.2016, 12:48
Помогаю со студенческими работами здесь

Как можно использовать один и тот же скрипт VideoView на двух лайоутах?
Есть такой простенький код для VideoView. Подскажите пожалуйста, как можно использовать этот класс...

Один запрос к базе вместо 4
Здравствуйте. Помогите решить проблемку, хотя наврятли она решима но всетки может есть решение....

Вместо двух фреймов один
У меня такой вопрос, я хочу сделать что бы при нажатиии на ссылку фрейм загружался на место двух...

Сделать вместо двух бордеров один
<input placeholder="Логин" name = 'login' type="text" pattern="{2,64}" required title="Разрешены...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru