SQL запрос

A
На сайте с 09.01.2013
Offline
33
359

Господа здравствуйте. Помогите реализовать sql запрос. Суть:

Есть товар, у него 2 параметра в таблице:

/***Артикул***/ /***АртикулРодителя***/

А123 ------------------------ 0

А3423------------------------ А123

П3434 ------------------------ А123

Р43243 ------------------------ А123

Т.е. если мы вводим А123, нам должно найти этот товар и все подчиненные, если мы вводим один из подчиненных, вывести родитель и все подчиненные этого родителя. Могз сломал себе, как это красиво сделать.

prominus
На сайте с 18.09.2013
Offline
23
#1

Какая система управления базами данных? mysql, orale, mssql, informix? Дерево связей только два уровня?

A
На сайте с 09.01.2013
Offline
33
#2
prominus:
Какая система управления базами данных? mysql, orale, mssql, informix? Дерево связей только два уровня?

mysql

да верно, 2 уровня

prominus
На сайте с 18.09.2013
Offline
23
#3

Одним запросом наверное выйдет громоздко, я бы лучше разбил на два - первый определяет уровень в второй собирает необходимые данные, агрегатных ф-ций у mysql насколько я помню нет.

Или сделать через динамический SQL

---------- Добавлено 20.09.2013 в 13:20 ----------

select * from product p where p.artikul = 'А123' and p.artikul_parent = '0'
union all
select * from product p where p.artikul_parent = 'А123'
union all

select p2.* from product p1, product p2 where p1.artikul_parent = p2.artikul and p1.artikul = 'А123'
union all
select p1.* from product p1, product p2 where p1.artikul_parent = p2.artikul_parent and p2.artikul = 'А123'

Но наверное любой администратор баз данных убъет за такое.

A
На сайте с 09.01.2013
Offline
33
#4

Ошибка Unknown column 'p1.artikul_parent' in 'where clause'

prominus
На сайте с 18.09.2013
Offline
23
#5

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

/***Артикул***/

/***АртикулРодителя***/

хотя скорее всего они другие, а название таблицы не давали вообще!

---------- Добавлено 20.09.2013 в 13:47 ----------

В любом случае, лучше сначала определить какаой уровень у записи с указаным артикулом, потом выполнить два запроса с объединением. Так выходит в сумме 3 запроса, а в примере который привел я - 4.

Так же не совсем понятна фраза "красиво". Для баз данных такого понятия не существует, там есть только понятие быстро.

A
На сайте с 09.01.2013
Offline
33
#6

Про имена полей и т.д. опустим. Если использую эти запросы

select * from product p where p.artikul = 'А123' and p.artikul_parent = '0'

union all

select * from product p where p.artikul_parent = 'А123'

union all

select p2.* from product p1, product p2 where p1.artikul_parent = p2.artikul and p1.artikul = 'А123'

то работает след. образом:

если вводим родителя, то получаем его и всех подчиненных

а если вводим одного из подчиненных то получаем только родителя, а еще нужно как то получить и всех подчиненных этого родителя

prominus
На сайте с 18.09.2013
Offline
23
#7

За выборку, если вводим подчиненные отвечают два последний подзапроса

select p2.* from product p1, product p2 where p1.artikul_parent = p2.artikul and p1.artikul = 'А123'

union all

select p1.* from product p1, product p2 where p1.artikul_parent = p2.artikul_parent and p2.artikul = 'А123'

первый

select p2.* from product p1, product p2 where p1.artikul_parent = p2.artikul and p1.artikul = 'А123'
по идее находит ролителя

второй

select p1.* from product p1, product p2 where p1.artikul_parent = p2.artikul_parent and p2.artikul = 'А123'
- должен выдать подчиненных с таким же родителем
A
На сайте с 09.01.2013
Offline
33
#8

Все еще актуально, т.к. если вводить родителя в этот запрос, валиться много лишнего

select p1.* from product p1, product p2 where p1.artikul_parent = p2.artikul_parent and p2.artikul = 'А123'
prominus
На сайте с 18.09.2013
Offline
23
#9

Этот SQL-запрос берет товары c fhnbrekjv 'А123' и отдаёт все товары с такими же родительскими артикулами. Может вы неверно преобразовали его под свои таблицы и поля.

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий