SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 08.08.2012 14:35:24

батарейка
Участник
Зарегистрирован: 29.11.2010
Сообщений: 20

Хитрая выборка из двух таблиц

Добрый день. Ваш форум запомнился доброжелательностью и отзывчивостью.

У меня такой вопрос, на который я не смог построить запрос.

Итак есть две таблицы, одна категория товара, другая сам товар. Это для примера.

В таблице категории не просто id, name прописаны, но так же и есть поле section в которое я могу записать id из этой же таблицы - что означает мастер категория.

Например у нас есть


id, section, name

1, 0, Электроника
2, 0, Бытовая техника
3, 2, Для кухни


В третей записи мы видим - section = 2 что означает что Бытовая техника является для категории "для кухни" родителем. Тем самым строя каталог товаров я могу отобразить все подразделы данного раздела выбрав их по полю section

Итак вопрос.

Есть вторая таблица с товарами

Например

id, cat, desc

1, 1, test
2, 1, test 2
3, 3, test 3

Если бы первая таблица категорий товаров была бы без поля section тоесть категории были бы только одномерные и товары четко привязывались только к этим так сказать корневым разделам то запрос на построение категорий товаров был бы таким:

Select id, name FROM tbl1 WHERE tbl1.id = tbl2.cat

Тем самым мы бы исключили отображение "пустых" категорий в которых товара нет.

Подскажите как по такому же принципу построить запрос отобразив все категории товаров, если даже в самой категории ничего может быть и нет, как у нас в примере видно что в категории "Бытовая техника" нет товаров, но в ней есть субкатегория "Для кухни" в которой уже есть товар.

Надеюсь написал мысли доходчиво, благодарю за ваше время и помощь.

Неактивен

 

#2 08.08.2012 16:27:20

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Хитрая выборка из двух таблиц

Select tbl2.id, tbl2.name FROM tbl1,tbl2 WHERE tbl1.id = tbl2.cat or tbl1.id = tbl2.section;

Неактивен

 

#3 08.08.2012 16:49:19

батарейка
Участник
Зарегистрирован: 29.11.2010
Сообщений: 20

Re: Хитрая выборка из двух таблиц

vasya написал:

Select tbl2.id, tbl2.name FROM tbl1,tbl2 WHERE tbl1.id = tbl2.cat or tbl1.id = tbl2.section;

У нас в tbl2 нет section. Section только в первой таблице.

Неактивен

 

#4 08.08.2012 16:53:10

батарейка
Участник
Зарегистрирован: 29.11.2010
Сообщений: 20

Re: Хитрая выборка из двух таблиц

В tbl2 у нас только id(порядковый), cat (к какой категории привязка), desc (описание).

В tbl1 у нас id (порядковый), section (id родителя из тойже таблицы, может быть пустым так как не все категории относятся к каким то категориям выше), name (имя категории).

Отредактированно батарейка (08.08.2012 16:54:12)

Неактивен

 

#5 08.08.2012 23:10:59

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Хитрая выборка из двух таблиц

Тогда:

SELECT tbl1.id, tbl1.name FROM tbl1,tbl2 WHERE tbl1.id = tbl2.cat OR tbl2.id = tbl1.section;

Неактивен

 

#6 11.08.2012 11:11:44

батарейка
Участник
Зарегистрирован: 29.11.2010
Сообщений: 20

Re: Хитрая выборка из двух таблиц

Извиняюсь что не ответил сразу.

Начиная пробовать ваш запрос понял что он тоже к сожалению не куда не годится. Я не думаю что то что я описал можно запросить таким простым запростом.

"OR tbl2.id = tbl1.section;" - в tbl2 - id это все лишь порядковый номер товара, и он ни в какой степени не причастен к записи в tbl1.section.

В tbl1.section могут быть айди от tbl1.id - тоесть той-же таблицы показывая что этот раздел например 5 находится в разделе 3, тогда запись была бы id, name, section = {5, "комбайны", 3} - Где section=3 является записью из тойже таблицы под айди 3. id, name, section = {3, "изделия для полей", 0}. В данной записи поле section=0 тоесть этот раздел ни где не находится и является корневым.

Так просто можно построить вложенную до бесконечности структуру иерархическую. Но потом конечно уже сложнее сделать запросто чтоб выбрать все корневые разделы в субразделах которых лежат товары.

Я думал что такое можно сделать через Join left но у меня чтото ничего не получилось нормального.

Неактивен

 

#7 11.08.2012 13:59:45

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Хитрая выборка из двух таблиц

вместо
OR tbl2.id = tbl1.section;
нужно
OR tbl2.cat = tbl1.section;

батарейка написал:

Так просто можно построить вложенную до бесконечности структуру иерархическую. Но потом конечно уже сложнее сделать запросто чтоб выбрать все корневые разделы в субразделах которых лежат товары.

Данный запрос будет выбирать корневые разделы только для одного уровня вложенности.

Рекомендую посмотреть http://webew.ru/articles/2080.webew

Неактивен

 

#8 12.08.2012 00:10:56

батарейка
Участник
Зарегистрирован: 29.11.2010
Сообщений: 20

Re: Хитрая выборка из двух таблиц

Благодарю за помощь!

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson