Задавайте вопросы, мы ответим
Вы не зашли.
В теме "Группировка в запросе" рассматривался интересный случай выборки групп с 3 потомками.
У меня немного похожая задача:
Мне нужно выбрать 10 последних комментариев к объекту (например фото) с 3мя подкомментариями. У каждого комментария могут быть свои комментарии (аля Вконтакт).
В предыдущей теме с помощью запроса:
set @n=3, @i=0, @p=0; select * from таблица_групп t1 join таблица_потомков t2 on t1.x=t2.y where @i<@n and if(@p=x, @i:=@i+1,(@i:=0) or (@p:=x));
не получилось задать LIMIT для групп, он считался для групп + потомки групп.
Неактивен
Может сначала необходимо получить комментарии к фотографии, собрать id данных комментариев и потом уже вторым запросом искать подкомментарии к "верхним" комментариям:
set @n=3, @i=0, @p=0; SELECT * FROM posts WHERE ( @i<=@n AND IF(@p=parent_post_id, @i:=@i+1, (@i:=0) or (@p:=parent_post_id)) ) AND parent_post_id IN (id'шники комментариев);
Но почему-то мускуль возвращает пустой результат. Помогите найти ошибку
Неактивен
maxtor написал:
В теме "Группировка в запросе" рассматривался интересный случай выборки групп с 3 потомками.
Если бы прочитали всю тему, то не писали бы ошибочный вариант запроса, приведенный в начале темы http://sqlinfo.ru/forum/viewtopic.php?pid=20267#p20267
maxtor написал:
не получилось задать LIMIT для групп, он считался для групп + потомки групп.
таблица_групп t1 => (select * from таблица_групп limit 10) t1 ??
Неактивен
vasya, спасибо.
Добавил в свой запрос объединение с таблицей users и запрос начал вести себя по другому...
для запроса:
set @n=3, @i=0, @p=0; SELECT posts.* FROM posts WHERE parent_post_id IN (30, 24, 21, 20, 19, 18) AND ( if(@p=parent_post_id, @i:=@i+1,(@i:=0) or (@p:=parent_post_id)) and @i<@n ) ORDER BY posts.id DESC
вывод такой:
при объединении с таблицей users:
set @n=3, @i=0, @p=0; SELECT posts.* FROM posts LEFT JOIN users ON users.id = posts.user_id WHERE parent_post_id IN (30, 24, 21, 20, 19, 18) AND ( if(@p=parent_post_id, @i:=@i+1,(@i:=0) or (@p:=parent_post_id)) and @i<@n ) ORDER BY posts.id DESC
вывод такой:
С чем это может быть связано?
Неактивен
сама таблица `posts`:
Неактивен
А что показывает запрос:
SELECT posts.*
FROM posts
LEFT JOIN users
ON users.id = posts.user_id
WHERE parent_post_id IN (30, 24, 21, 20, 19, 18);
Неактивен
Неактивен
vasya, спасибо!
Неактивен
У меня тоже что-то похожее надо сделать! Буду очень признателен если поможете!!!!
Имеется таблица категорий
Неактивен
Одним запросом это не делается. Можете, например, написать хранимую
процедуру, которая будет обходить дерево, или воспользоваться стандартной
денормализацией «все родители» (т.е. табличка, в которой будут id и parent,
при этом родители будут не только непосредственные, но и «дедушки» и т.д.).
Неактивен
paulus написал:
Одним запросом это не делается. Можете, например, написать хранимую
процедуру, которая будет обходить дерево, или воспользоваться стандартной
денормализацией «все родители» (т.е. табличка, в которой будут id и parent,
при этом родители будут не только непосредственные, но и «дедушки» и т.д.).
А можно набросать хоть примерный код хранимой процедуры?! Просто я никогда раньше не использовал их!
Неактивен
Можно, я разрешаю
http://dev.mysql.com/doc/refman/5.5/en/ … edure.html
Неактивен
Обновил MySQL и запрос:
set @n=3, @i=0, @p=0; select * from (SELECT posts.* FROM posts LEFT JOIN users ON users.id = posts.user_id WHERE parent_post_id IN (30, 24, 21, 20, 19, 18) ORDER BY parent_post_id) t where if(@p=t.parent_post_id, @i:=@i+1,(@i:=0) or (@p:=t.parent_post_id)) and @i<@n;
Перестал работать... т.е. не выводит по 3 подкомментария...
Сейчас поведение такое - как только встречается 3 строчки с одинаковым parent_post_id, выборка сразу прекращается...
Что-то изменилось в MySQL?
Отредактированно maxtor (21.04.2012 17:15:10)
Неактивен
Запросы с переменными могут ломаться, да. Скорее всего, поменялся план выполнения
запроса, и присвоение производится в какой-то другой момент времени. Имеет смысл
смотреть в EXPLAIN.
Неактивен
А можете подсказать, как теперь нужно правильно составить запрос?
Неактивен
Вроде нашел:
select comments.*, users.username from ( select posts.*, if( @typex=posts.`obj_id`, @rownum:=@rownum+1, @rownum:=1+least(0,@typex:=posts.`obj_id`) ) rown from posts, ( select @rownum:=1, @typex:='_' ) zz where `obj_id` IN (12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1) order by `obj_id`, `id` DESC ) comments LEFT JOIN users ON users.id = comments.user_id where rown < 4
Верен данный подход?
Неактивен
Если работает, то да
Неактивен