gzhegow
@gzhegow
Думал, стану умнее, когда адаптируюсь, но нет

Как по-умному сделать мульти-JOIN + CASE-statement?

Есть в битриксе понятие "секции". Это как бы коллекция из разделов админки (со свойствами ключ-значение)
https://www.screencast.com/t/f9ESw5mYV5mP

Главное отличие от "элементов" в том, что свойства каждой секции хранятся в отдельной таблице со связью по ID "инфоблока" - который по сути описывает внешний вид и секций и элементов (является нейким таким неймспейсом) и коллекцией "элементов" одновременно

Собственно в чем беда - у нас есть 6 инфоблоков-"неймспейсов"-коллекций (напр. шины, диски, акб и еще пару штук)

Свойства каждой из категорий заданы по ID этого неймспейса. То есть структура базы битрикса примерно такая:

b_iblock - таблица с типами элементов (разделы админки)
b_iblock_section - таблица с секциями (категориями в админке)
b_utm_iblock_1_section - множественные свойства ключ-значение
b_utm_iblock_2_section - множественные свойства ключ-значение
b_utm_iblock_3_section [n...] - множественные свойства ключ-значение
b_uts_iblock_1_section - единичные свойства, где ключ это имя колонки, а значение - собственно значение
b_uts_iblock_2_section - единичные свойства, где ключ это имя колонки, а значение - собственно значение
b_uts_iblock_3_section [n...] - единичные свойства, где ключ это имя колонки, а значение - собственно значение

Ну то есть парни перемешали все в кучу и сделали помимо общепринятого реляционного вида данных ("нормальной" формы) - смесь нескольких форматов хранения, возможно тестировали удобность.

Так собственно вопрос:

Как грамотно подцепить все эти таблицы со свойствами в зависимости от выбранных секций? Типа если у секции такой-то инфоблок, подключить обе таблицы для него. Ясно что можно написать 22 left-join-а и вообще создавать запрос из PHP на-лету, но есть ли способ написать какой-то хитрый SELECT FROM SELECT чтобы он автоматически JOIN-ил одно к другому при условии наличия в выборке "еще одного" инфоблока?
  • Вопрос задан
  • 369 просмотров
Решения вопроса 2
gzhegow
@gzhegow Автор вопроса
Думал, стану умнее, когда адаптируюсь, но нет
Короче, трепались трепались, указывали, поясняли, вот решение.
sandbox.onlinephpfunctions.com/code/adb1eb06ae01c6...

"Неграмотно", зато быстро и работает.
Ответ написан
@Draconian
Oracle Developer
На чистом SQL такой селект написать не получится, насколько я могу судить, нужно строить запрос в php скрипте, в зависимости от нужных инфоблоков добавлять в селект нужные таблицы.

Если вам не нравится, как битрикс хранит данные ваших инфоблоков, напишите свой компонент, который это будет делать так, как вам нравится. Тогда не надо будет посылать незнакомых людей "заняться бенчмаркингом".
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
alexey-m-ukolov
@alexey-m-ukolov Куратор тега MySQL
Как грамотно подцепить все эти таблицы со свойствами в зависимости от выбранных секций?
Почему бы не воспользоваться стандартным API? Битриксоиды наворотили структуру БД, но они же и API для работы с ней написали.
Ваш гигантский сложный запрос, скорее всего, не будет быстрее и точно не будет кешироваться.
Ответ написан
Ваш ответ на вопрос

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

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