Нубский вопрос про Sql

bav46

табличка
Cats
CatId pk
ParentCatId rk to Cats на CatId
CatName varchar
Qnty int
имеем такой резалтсет
CatId ParentCatId CatName Qnt
1 NULL 'Лиска' 3
2 1 'Анфиска' 3
3 1 'Барсик' 0
4 1 'Машка' 1
5 2 'Зайка' 1
6 2 'Тузик' 0
7 2 'Мурка' 1
8 4 'Муська' 0
9 5 'Сосиска' 0
10 7 'Уська' 0
Имеем двух родаковских кошаков с Id (1 и 2)
задача выбрать ближайший помет, который имеет следующее потомство
результирующий запрос должен выдать
2 1 'Анфиска' 3
5 2 'Зайка' 1
или
4 1 'Машка' 1
7 2 'Мурка' 1
вообщем любого кошака в потомстве у которого есть свое потомство.
как-нить попроще и поизящнее

bav46

и для кошака с catid=4 ничего не выдавать

Dasar

для начала преобразовать таблицу в соответствии с http://en.wikipedia.org/wiki/Nested_set_model , а там скорее всего и запрос уже будет понятным.
ps
почему родитель один? и зачем в запросе тогда два кота?

mbolik1

select * from Cats crnt 
where crnt.ParentCatId = 1
and exists (select 1 from Cats chld where chld.ParentCatId = crnt.CatId)

bav46

потому что в задаче требуется считать что рожает только кошка
признак Qnty можно заменить на стерилизована или нет, что может ли она рожать чтобы ее показать
в запросе два кошачих айди ибо надо одним запросом дернуть любого кошака от парентов, которые могут рожать, айдишников может быть и больше
у меня получилось пока только следующее
 
 
select cc.* from Cats c
left join Cats cc on c.CatId=cc.ParentCatId and cc.Qnty>1
where cc.CatId is not null and c.CatId in (1,2,....)
group by c.CatId

SergeRRRRRR


select * from table
start with catid=1
connect by parentcatid= prior catid
and qnty!=0

bav46

че за база ?

psm-home

Oracle, вестимо

marat7256

Oracle, вестимо
База домашних котов на оракле!

SergeRRRRRR

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

luna89

Я прочитал формулировку, но ничего не понял.

apl13

Завхоз котов разводит. :umn: :cat:

SergeRRRRRR

ничего святого, студентов разводил, теперь и за котиков взялся!

6yrop

Я прочитал формулировку, но ничего не понял.
Я тоже. Въехал в изначальную формулировку только после того, как увидел запрос постами ниже:
 
select * from Cats crnt
where crnt.ParentCatId = 1
and exists (select 1 from Cats chld where chld.ParentCatId = crnt.CatId)

Иногда код читать проще. :)

bav46

кошаков надо разводить.
задача следующая, есть кошак у нее есть помет, вот надо выбрать любого кошака из помета родившего и способного рожать. единственное что в запрос приезжает массив кошаков для расмотрения 1,2,4 итд вот и надо выдать любого кошака следующего в потомстве для каждого из этих айди или не выдать если скажем у кошака весь помет стерилизован или родились только мальчики.

SergeRRRRRR

дык, чо за база то, вроде оракловый скул и его иерархические запросы спасут отца русской котопромышленности, не?

bav46

Мускул

mbolik1

Я правильно понимаю что тебе для каждого поданного ID нужно выбрать ровно 1 кошака родившего и способного рожать (или 0 если таких нет)?

bav46

да верно, при этом любого

mbolik1

Тогда нужны детали: какой версии у тебя база? 2005, 2008, 2012?

kill-still

И в каком формате приезжают IDшники для поиска.

6yrop

задача следующая, есть кошак у нее есть помет, вот надо выбрать любого кошака из помета родившего и способного рожать. единственное что в запрос приезжает массив кошаков для расмотрения 1,2,4 итд вот и надо выдать любого кошака следующего в потомстве для каждого из этих айди или не выдать если скажем у кошака весь помет стерилизован или родились только мальчики.
уже ж написали почти
 
SELECT MIN(CatId) AS CatId,
ParentCatId
FROM Cats
WRE ParentCatId IN (1, 2)
AND EXISTS (
SELECT 1 FROM Cats ChildCats WRE ChildCats.ParentCatId = Cats.CatId)
AND Qnty <> 0
GROUP BY
ParentCatId

Lejkeee

А есть такая функция, чтобы можно было выбирать рандомного котенка, а не минимального из них?

6yrop

можно через UUID()
но, я так понимаю, временная таблица для результата потребуется

luna89

В MySQL такое прокатывает:

SELECT CatId,
ParentCatId
FROM Cats
WRE ParentCatId IN (1, 2)
AND EXISTS (
SELECT 1 FROM Cats ChildCats WRE ChildCats.ParentCatId = Cats.CatId)
AND Qnty <> 0
GROUP BY
ParentCatId

6yrop

да, точно, вспомнил такой баг в MySQL. Да, можно его для рандомности использовать. Я так понимаю, рандомность будет определяться состоянием индексов.

kill-still

Ещё такой нюанс на больших объёмах джойн на саму себя будет намного быстрее работать, чем EXISTS.

6yrop

надо сравнивать какие планы строятся, там же еще GROUP BY.
Оставить комментарий
Имя или ник:
Комментарий: