Forum Webscript.Ru
		Общие => Базы данных => Тема начата: Enemy от 30 Октября 2007, 06:51:35
		
			
			- 
				Здравствуйте. 
 
 Не могу написать один запрос и решил наконец спросить у вас.
 
 Таблица:
 
 -------------------------------------------------------------------
 | ID | PARENT_ID | FLAG |
 | 1        |    0    |    0    |
 | 2 | 1 | 0 |
 | 3 | 1 | cat |
 | 4 | 0 | 0 |
 | 5 | 0 | 0 |
 | 6 | 5 | 0 |
 | 7 | 0 | cat |
 -------------------------------------------------------------------
 
 Задача: Надо выбрать все записи в которых parent record (parent_id=0) и все соответстующие ему child records имееют flag != "cat"
 
 Тоесть в данном примере в результате будет получено только три записи с ID: 4,5,6.
 
 Большое спасибо за любые идеи.
- 
				и как это будет получена запись №6...в ней парент ид = 5
 
 стандартными средствами не реализуешь такого рода запрос...если я тебя правильно понял.......Должны искаться Parent_id=0 потом искаться зависимые от низ записи и просматриваться значение flag....mysql такого не могёт
- 
				DartSidius 
 record # 6 будет выбран с БД потому что он (child) и record # 5 (его parent) имеют FLAG != \'cat\'
 
 Должен быть выход.
- 
				3 уточнение:
 1) насколько большая база данных?
 2) возможна вложенность child в child ?
 3) возможен запрос имет 2 подзапроса, но только 2 даст ответ, тоесть 1 создает временную таблицу?
 
 если есть вложенность child в child то до какого уровня? так как если неопределенного уровня то базы данных не умеют работать рекурсивно.
- 
				Вот составил запрос, только ногами не бить :-)
 select c1.id from aaa p1 left Join aaa c1 on c1.parent_id=p1.id or c1.id=p1.id where  p1.parent_id=0 AND p1.flag!="cat" AND (select 1 from aaa where parent_id=p1.id AND flag="cat" limit 1) is null
- 
				Altaxar 
 Должен тебе сказать большое спасибо ;). Query работает.
 
 Только один вопрос на счет структуры таблицы. На сколько я видел, во многих applications в случае когда используются parent и child records - как правило используют две таблицы (где в одной все parent, а в другой все child соответственно). По такой системе сделаны напр. форумы.
 
 В таблице пока не более 3000 записей и в принцыпе можно переписать скрипты..
 
 Ваши соображения.
- 
				для удобства можно разбить, даже желательно, это нормальный тон для организации таблиц. причем в моем запросе можно будет 1 условие убрать p1.parent_id=0. и вообще чаще всего данные у parent и child разные. Но надо будет задуматься о id parent i child, данный запрос выводит id того и другого. а при разделении будет все подругому. 
 
 Но если как я уже писал, что child может быть parent\'ом для другого child ,бывает и такая структура, то сдесь естественно одна таблица.(и мой запрос тут бесилен)
 
 Мой запрос для твоей задачи оптимален, как мне сказали.
 
 P.S. переписывать желательно через алгоритм :).