Результат двух таблиц

minamo

Перерыл все темы, но так и не нашел похожую тему.Есть две таблицы:Таблица tbl1:id name content data1 Элемент1 Пусто 00.00.002 Элемент2 Пусто 00.00.003 Элемент3 Пусто 00.00.004 Элемент4 Пусто 00.00.005 Элемент5 Пусто 00.00.00Таблица tbl2:id parent value type descript1 1 100р. Цена многотекста2 1 красный Цвет многотекста 3 2 100р. Цена многотекста 4 2 белый Цвет многотекста Нужно получить вот такой результат:[0] => Array ( [id] => 1 [name] => Элемент1 [content] => Пусто [data] => 00.00.00 )[1] => Array ( [id] => 1 [value] => 100р. [type] => Цена [descript] => многотекста )[2] => Array ( [id] => 2 [value] => красный [type] => Цвет [descript] => многотекста )То есть нужен результат поиска первой таблице и по id первой(tbl1) таблицы выбрать все parent второй(tbl2) таблицыТо есть к найденному элементу нужно прицепить его свойства из таблицы tbl2.Я составлял запросы, но ничего путнего не получилось.Пожалуйста, помогите составить правильный запрос.
11 ответов

minamo

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


minamo

Я не силен в составлении сложных запросов, поэтому сильно не пинайте.Например вот такой запрос. Этот запрос взят с одного из блогов и адаптирован под мои нужды, но не до конца.
SELECT a.id, a.name, GROUP_CONCAT(DISTINCT b.type ORDER BY b.type ASC SEPARATOR ', ') AS property FROM iblock_test a LEFT JOIN iblock_property_list b ON b.parent=a.id GROUP BY a.id
где iblock_test - это список всех существующих элементов. iblock_property_list - это список свойств, которые должны подключаться к элементу по parent-у.В данном запросе выводятся все элементы и принадлежащие к ним свойства через запятую и то только название свойства. Кроме названия свойства, мне еще надо другие поля выводить. В итоге, что бы получилось так же, как в первом посту:id свойства, parent свойства, type свойства и value свойства.Пробовал вот так:SELECT id,name FROM iblock_test where id = 1 JOIN SELECT type,parent FROM iblock_property_list where parent = 1С одной стороны вроде бы все верно возвращает, за исключение полей. С другой стороны, если в одном из подзапросов перечисляемых полей будет больше, то получим ошибку, так как кол-во полей не совпадает с другим подзапросом.


minamo

Например вот такой запрос. <pre class="prettyprint linenums"> SELECT a.id, a.name, GROUP_CONCAT(DISTINCT b.type ORDER BY b.type ASC SEPARATOR ', ') AS property FROM iblock_test a LEFT JOIN iblock_property_list b ON b.parent=a.id GROUP BY a.id </pre> Кроме названия свойства, мне еще надо другие поля выводить.
ну так и выводите -
GROUP_CONCAT(DISTINCT concat(b.type,'; ',b.value,'; ',b.description) ORDER BY b.type ASC SEPARATOR ', ')
, в чём проблема-то?ЗЫ. Пока вы явно, с использованием тега [ csv ], не покажете, что именно и в каком виде хотите получить, навряд ли удастся что-то с уверенностью вам посоветовать.ЗЗЫ. А такое
SELECT a.id, a.name <...> GROUP BY a.id
вообще нельзя писать, если точно не уверены, что надо именно так.


minamo

мне не нужен csv. Я использовал такой запрос, потому что не нашел других решений.Я плохо знаю синтаксис запросов.Мог бы сделать и двумя запросами отдельно, но хочется сделать всё через один запрос.Задача заключается в том, что бы был выбран Элемент1 и все его свойства.Результат, который я хотел бы получить из выборки двух таблиц:name = Элемент1content = ПустоСвойство1:value = 100рtype = Цена descript = многотекстаСвойство2:value = красный type = Цвет descript = многотекста


minamo

Нужно получить вот такой результат:[0] => Array ( [id] => 1 [name] => Элемент1 [content] => Пусто [data] => 00.00.00 )[1] => Array ( [id] => 1 [value] => 100р. [type] => Цена [descript] => многотекста )[2] => Array ( [id] => 2 [value] => красный [type] => Цвет [descript] => многотекста )
так нельзя, но можно так [0] => Array ( [id] => 1 [value] => Пусто [type] => Пусто [descript] => Пусто [name] => Элемент1 [content] => Пусто [data] => 00.00.00 )[1] => Array ( [id] => 1 [value] => 100р. [type] => Цена [descript] => многотекста [name] => Пусто [content] => Пусто [data] => Пусто )[2] => Array ( [id] => 2 [value] => красный [type] => Цвет [descript] => многотекста [name] => Пусто [content] => Пусто [data] => Пусто )


minamo

>мне не нужен csv. csv нужен остальным читателям форума, чтобы быстрее вас понять. Это тег оформления такой.
Результат, который я хотел бы получить из выборки двух таблиц:
Ну так и чем вам не нравится моя правка вашего запроса? Она не работает или выдаёт не то, что надо?artas, это если свойств всего 2, а если их 500? имхо только груп_конкат(конкат(поле1,...,полеN)) с разными разделителями спасёт отца русской демократии :)


minamo

>мне не нужен csv. csv нужен остальным читателям форума, чтобы быстрее вас понять. Это тег оформления такой.Ну так и чем вам не нравится моя правка вашего запроса? Она не работает или выдаёт не то, что надо?artas, это если свойств всего 2, а если их 500? имхо только груп_конкат(конкат(поле1,...,полеN)) с разными разделителями спасёт отца русской демократии :)
С правкой всё нормально, всё как надо работает, большое спасибо!Просто хотел немного в другой форме. Подскажите пожалуйста, как из такого запроса вытащить только один элемент? Не могу разобраться куда подставить WHERE id = 1


minamo

куда подставить WHERE id = 1
перед групбаем, и прочитайте уже про синтаксис селекта :)


minamo

tanglir, понимаю, что на 500 не канает. Но и ограничение груп_конката около полусотни килобайт, так что это тоже не вариант для 500 текстовых полей


minamo

tanglir, понимаю, что на 500 не канает. Но и ограничение груп_конката около полусотни килобайт, так что это тоже не вариант для 500 текстовых полей
у GROUP_CONCAT можно увеличить ограничение, но не знаю что будет, если там окажется целая статья на 10 000 символов. Не умрет ли такой запрос?Твой вариант тоже хорош.Так как на каждый элемент около 20 - 30 свойств будет, то не думаю что так страшно тормозить выборка будет.


minamo

tanglir,Ну... у меня не 500, но количество динамически меняется... и пока только растет... делаю примерно также, только для ПХП сделал класс, который генерит нужный GROUP_CONCAT, превращая выдачу в типичный json. Всего четрые метода:Выдрать простое поле , выдрать числовое поле , выдрать подобъект и выдрать простой массив (внутренний GROUP_CONCAT)...Фсё. И какой длинны там запрос формируется уже и не гляжу даже... ;)