Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В. PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В. MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум MySQL

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Ищу бездетных родителей : )
 
 автор: Eugene77   (05.07.2009 в 16:15)   письмо автору
 
 

Структура таблицы:
create Table ie(
child INT,
parent INT
)

Это иерархическая структура, которая указывает кто чей ребёнок, кто чей родитель.
Требуется:
Найти всех деток не являющихся родителями.
То есть все такие строки у которых число указанное в колонке child никогда не всtречается в колонке parent.

  Ответить  
 
 автор: Trianon   (05.07.2009 в 16:35)   письмо автору
 
   для: Eugene77   (05.07.2009 в 16:15)
 

такие узлы называются листьями.
решается одним LEFT JOIN запросом
child - имя неудачное.
узел не может быть собственным потомком.

  Ответить  
 
 автор: Eugene77   (05.07.2009 в 17:12)   письмо автору
 
   для: Trianon   (05.07.2009 в 16:35)
 

>решается одним LEFT JOIN запросом

Как написать что его НЕТ в колонке?
Я не знаю как это условие записывается.

  Ответить  
 
 автор: .............   (05.07.2009 в 17:19)
 
   для: Eugene77   (05.07.2009 в 17:12)
 

Если нет, то подставляется NULL. Для провери NULL есть оператор IS NULL.

  Ответить  
 
 автор: Eugene77   (05.07.2009 в 17:18)   письмо автору
 
   для: Trianon   (05.07.2009 в 16:35)
 

Я чувствую, что что-то должно быть простое, но кроме сложного запроса
SELECT * FROM ie
WHERE
child NOT IN (SELECT parent FROM ie)

ничего не могу придумать.

  Ответить  
 
 автор: Trianon   (05.07.2009 в 17:20)   письмо автору
 
   для: Eugene77   (05.07.2009 в 17:18)
 

http://dev.mysql.com/doc/refman/5.1/en/join.html
http://www.mysql.ru/docs/man/JOIN.html

  Ответить  
 
 автор: Eugene77   (05.07.2009 в 18:37)   письмо автору
 
   для: Trianon   (05.07.2009 в 17:20)
 

это надо полагать:
SELECT ie.* FROM ie AS ie1 LEFT JOIN ie AS ie2
ON ie1.parent = ie2.child 
WHERE ie1.parent IS NULL

?
Такого даже в книге у Симяднева нет.
Так что не удивительно что я не знаю.

  Ответить  
 
 автор: Trianon   (05.07.2009 в 18:54)   письмо автору
 
   для: Eugene77   (05.07.2009 в 18:37)
 

Зато это есть у Симдянова на форуме.

  Ответить  
 
 автор: Eugene77   (05.07.2009 в 19:35)   письмо автору
 
   для: Trianon   (05.07.2009 в 18:54)
 

Какэто вы такой поисковый запрос догадались сочинить?
Ник автора разве является частью сообщения?

  Ответить  
 
 автор: Eugene77   (05.07.2009 в 19:40)   письмо автору
 
   для: Trianon   (05.07.2009 в 18:54)
 

Кстати, не очень меня порадовал этот запрос.
Трудно читаемый.
С двойным селектом-то хоть всё прозрачно.
Вы уверены с Left Join быстрей будет работать?
Или у него есть ещё какое-то преимущество?

  Ответить  
 
 автор: Trianon   (05.07.2009 в 20:30)   письмо автору
 
   для: Eugene77   (05.07.2009 в 19:40)
 

Как насчет проверить?
Я скорее сложный запрос буду дольше вспоминать, чем эту связку.
Вообще же сильно советую приучить себя мыслить JOIN-ON'ами.
И все (даже весьма сложные) селекты и обновления и удаления при этом пишутся на раз.

  Ответить  
 
 автор: Eugene77   (06.07.2009 в 18:37)   письмо автору
 
   для: Trianon   (05.07.2009 в 20:30)
 

>Вообще же сильно советую приучить себя мыслить JOIN-ON'ами.
>И все (даже весьма сложные) селекты и обновления и удаления при этом пишутся на раз.

Ах вот оказывается в чём секрет!
А я долго не мог понять, как стать знатоком MySQL.

Проверять на производительность не буду - это будет шаг через ступеньку. Мне бы основы понять...

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования