Выборка одним запросом

demis

Новичок
Выборка одним запросом

Есть струкутра таблицы.
id,idp,list,...
idp - Это id родителя.
list - Является ли виршина листом или корнем.
Вообщем, бесконечное дерево.
Нужно эффективно подсчитать кол-во элеметов(листов) во всех подкорнях заданного корня.
Вопрос:
Можно ли сделать это запросом в mysql без рекурсивных вызовов на php.
 

Screjet

Новичок
Если в родительских записях есть инфа о детях, то можно. Иначе таки придется проходиться рекурсивно.
 

demis

Новичок
Originally posted by Screjet
Если в родительских записях есть инфа о детях, то можно. Иначе таки придется проходиться рекурсивно.
нету инфы о детях. Точно никаких запросов не существует?
и чем может помочь инфа о детях?
 

Screjet

Новичок
2. Если есть условия, что ID детей всегда больше ID родителя, то можно сделать нечто такого:
[sql]
select Parent_ID, count(*) from tree_table where ID > {root_ID} group by Parent_ID;
[/sql]
Для каждого родителя подсчитаем число детей, но не будет учета вложенности в дочерных папках.
чем может помочь инфа о детях?
Как минимум об их количестве и таким образом отпадет необходимость подсчета детей и не будет пустых запросов при построении дерева.
 

demis

Новичок
В том-то и дело, что во вложенных папках тоже считать надо.

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

Я уже и про кеш подумал. Никто не делал подобие кеша? с какой стороны подойти. Думаю сделать так:
При первом обращении генерить страницу динамическую + сохранять в статическую. После уже брать статическую. Тут же опять возникает вопрос, как определить, когда были произведены изменения в таблице, чтобы по-новому html-файлы генерить. Есть ли запрос, определяющий дату изменения таблицы?
 

MadMike

Новичок
Originally posted by demis
Есть ли запрос, определяющий дату изменения таблицы?
Есть такой тип timestamp. Вот если такое поле в таблицу добавить, то при каждом апдейте записи оно автоматически будет становиться now() - естественно, только для этой записи.
А еще тема - транзакции юзать. Иногда помогает.
 

demis

Новичок
Originally posted by MadMike
¬¦¬г¬д¬о ¬д¬С¬Ь¬а¬Ы ¬д¬Ъ¬б timestamp. ¬Ј¬а¬д ¬Ц¬г¬Э¬Ъ ¬д¬С¬Ь¬а¬Ц ¬б¬а¬Э¬Ц ¬У ¬д¬С¬Т¬Э¬Ъ¬и¬е ¬Х¬а¬Т¬С¬У¬Ъ¬д¬о, ¬д¬а ¬б¬в¬Ъ ¬Ь¬С¬Ш¬Х¬а¬Ю ¬С¬б¬Х¬Ц¬Ы¬д¬Ц ¬Щ¬С¬б¬Ъ¬г¬Ъ ¬а¬Я¬а ¬С¬У¬д¬а¬Ю¬С¬д¬Ъ¬й¬Ц¬г¬Ь¬Ъ ¬Т¬е¬Х¬Ц¬д ¬г¬д¬С¬Я¬а¬У¬Ъ¬д¬о¬г¬с now() - ¬Ц¬г¬д¬Ц¬г¬д¬У¬Ц¬Я¬Я¬а, ¬д¬а¬Э¬о¬Ь¬а ¬Х¬Э¬с ¬п¬д¬а¬Ы ¬Щ¬С¬б¬Ъ¬г¬Ъ.
¬Ў ¬Ц¬л¬Ц ¬д¬Ц¬Ю¬С - ¬д¬в¬С¬Я¬Щ¬С¬Ь¬и¬Ъ¬Ъ ¬р¬Щ¬С¬д¬о. ¬Є¬Я¬а¬Ф¬Х¬С ¬б¬а¬Ю¬а¬Ф¬С¬Ц¬д.
¬і¬д¬в¬С¬Я¬Я¬а, ¬С ¬б¬з¬б¬Ю¬С¬Ы¬С¬Х¬Ю¬Ъ¬Я ¬Щ¬Я¬С¬Ц¬д ¬Ъ ¬Т¬Ц¬Щ timestamp ¬Х¬С¬Ш¬Ц ¬Х¬С¬д¬е ¬г¬а¬Щ¬Х¬С¬Я¬Ъ¬с.
¬і¬д¬С¬д¬Ъ¬г¬д¬Ъ¬Ь¬С ¬в¬с¬Х¬С : ¬Ј¬н¬в¬С¬Ш¬Ц¬Я¬Ъ¬с ¬©¬Я¬С¬й¬Ц¬Я¬Ъ¬Ц
¬¶¬а¬в¬Ю¬С¬д ¬Х¬Ъ¬Я¬С¬Ю¬Ъ¬й¬Ц¬г¬Ь¬Ъ¬Ы
¬І¬с¬Х¬н 314
¬Ґ¬Э¬Ъ¬Я¬С ¬в¬с¬Х¬С ©Є 110
¬І¬С¬Щ¬Ю¬Ц¬в ¬в¬с¬Х¬С ©Є 215 Bytes
¬Ґ¬С¬Э¬Ц¬Ц Autoindex 315
¬і¬а¬Щ¬Х¬С¬Я¬Ъ¬Ц ¬і¬Ц¬Я 28 2004 ¬Ф., 22:09
¬±¬а¬г¬Э¬Ц¬Х¬Я¬Ц¬Ц ¬а¬Т¬Я¬а¬У¬Э¬Ц¬Я¬Ъ¬Ц ¬і¬Ц¬Я 28 2004 ¬Ф., 22:14

¬Б ¬Ц¬л¬Ц ¬Я¬Ц ¬в¬С¬Щ¬Т¬Ъ¬в¬С¬Э¬г¬с, ¬У¬в¬а¬Х¬Ц ¬б¬а¬Ь¬С ¬Я¬Ц ¬Я¬С¬Х¬а. ¬Ї¬а ¬Х¬е¬Ю¬С¬р, ¬Ц¬г¬Э¬Ъ ¬Я¬Ц ¬б¬а ¬г¬а¬Щ¬Х¬С¬Я¬Ъ¬р ¬ж¬С¬Ы¬Э¬а¬У ¬Т¬С¬Щ ¬Х¬С¬Я¬Я¬н¬з ¬а¬б¬в¬Ц¬Х¬Ц¬Э¬с¬Ц¬д, ¬д¬а ¬Ц¬г¬д¬о ¬У¬г¬Ц¬д¬С¬Ь¬Ъ ¬ж¬е¬Я¬Ь¬и¬Ъ¬с. ¬С timestamp ¬Ъ¬Щ¬У¬в¬С¬д ¬Ь¬С¬Ь¬а¬Ы-¬д¬а.
 

MadMike

Новичок
Originally posted by demis
¬і¬д¬в¬С¬Я¬Я¬а, ¬С ¬б¬з¬б¬Ю¬С¬Ы¬С¬Х¬Ю¬Ъ¬Я ¬Щ¬Я¬С¬Ц¬д ¬Ъ ¬Т¬Ц¬Щ timestamp ¬Х¬С¬Ш¬Ц ¬Х¬С¬д¬е ¬г¬а¬Щ¬Х¬С¬Я¬Ъ¬с.
¬і¬д¬С¬д¬Ъ¬г¬д¬Ъ¬Ь¬С ¬в¬с¬Х¬С : ¬Ј¬н¬в¬С¬Ш¬Ц¬Я¬Ъ¬с ¬©¬Я¬С¬й¬Ц¬Я¬Ъ¬Ц
¬¶¬а¬в¬Ю¬С¬д ¬Х¬Ъ¬Я¬С¬Ю¬Ъ¬й¬Ц¬г¬Ь¬Ъ¬Ы
¬І¬с¬Х¬н 314
¬Ґ¬Э¬Ъ¬Я¬С ¬в¬с¬Х¬С ©Є 110
¬І¬С¬Щ¬Ю¬Ц¬в ¬в¬с¬Х¬С ©Є 215 Bytes
¬Ґ¬С¬Э¬Ц¬Ц Autoindex 315
¬і¬а¬Щ¬Х¬С¬Я¬Ъ¬Ц ¬і¬Ц¬Я 28 2004 ¬Ф., 22:09
¬±¬а¬г¬Э¬Ц¬Х¬Я¬Ц¬Ц ¬а¬Т¬Я¬а¬У¬Э¬Ц¬Я¬Ъ¬Ц ¬і¬Ц¬Я 28 2004 ¬Ф., 22:14

¬Б ¬Ц¬л¬Ц ¬Я¬Ц ¬в¬С¬Щ¬Т¬Ъ¬в¬С¬Э¬г¬с, ¬У¬в¬а¬Х¬Ц ¬б¬а¬Ь¬С ¬Я¬Ц ¬Я¬С¬Х¬а. ¬Ї¬а ¬Х¬е¬Ю¬С¬р, ¬Ц¬г¬Э¬Ъ ¬Я¬Ц ¬б¬а ¬г¬а¬Щ¬Х¬С¬Я¬Ъ¬р ¬ж¬С¬Ы¬Э¬а¬У ¬Т¬С¬Щ ¬Х¬С¬Я¬Я¬н¬з ¬а¬б¬в¬Ц¬Х¬Ц¬Э¬с¬Ц¬д, ¬д¬а ¬Ц¬г¬д¬о ¬У¬г¬Ц¬д¬С¬Ь¬Ъ ¬ж¬е¬Я¬Ь¬и¬Ъ¬с. ¬С timestamp ¬Ъ¬Щ¬У¬в¬С¬д ¬Ь¬С¬Ь¬а¬Ы-¬д¬а.
Это только у меня такие глюки??????
 

demis

Новичок
Originally posted by MadMike
Это только у меня такие глюки??????
нет, не у тебя.
вообщем, суть в том, что пхпмайадмин определяет дату создания и дату изминения последней. пока не надо, не стал разбираться как он там определяет. возможно по файлу таблицы, возможно запрос какой-то есть, но то что ты предложил, изврат.
 

MadMike

Новичок
Что-то я не найду, где phpMyAdmin определяет дату создания и изменения таблицы... Я вот нашел только дату генерации дампа... Может, совсем плохо искал?
 

demis

Новичок
Originally posted by MadMike
Что-то я не найду, где phpMyAdmin определяет дату создания и изменения таблицы... Я вот нашел только дату генерации дампа... Может, совсем плохо искал?
кликаешь на таблицу, внизу, слева есть статистика ряда около используемого пространства.
это не только у меня одного, проверил и на хостинге, тоже есть. может старый админ у тебя или не все функции включены
 

MadMike

Новичок
Понял фишку. Почитаю код. Выяснил пока, что оно не работает на таблицах типа InnoDB. А у меня почти все такие...
Был неправ, исправлюсь. Вот посмотрю, как это работает, тогда расскажу. Даже самому интересно стало, но только это завтра, сегодня спать пора :)

-~{}~ 29.09.04 00:46:

Я идиот.
show table status from Database_name
 

Zagreba

Guest
если будет выборка из нескольких таблиц?
Например, есть таблица разделов chapter - id,name и есть таблица категорий category - id,name,id_ch(id из chapter)
нужно вывести все chapter и количество совпадений по id=id_ch. Как это реализовывается одним запросом?
 
Сверху