SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 08.12.2010 15:32:44

maxtor
Участник
Зарегистрирован: 21.07.2010
Сообщений: 20

Группировка в запросе 2

В теме "Группировка в запросе" рассматривался интересный случай выборки групп с 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 для групп, он считался для групп + потомки групп.

Неактивен

 

#2 08.12.2010 15:52:10

maxtor
Участник
Зарегистрирован: 21.07.2010
Сообщений: 20

Re: Группировка в запросе 2

Может сначала необходимо получить комментарии к фотографии, собрать 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'шники комментариев);

Но почему-то мускуль возвращает пустой результат. Помогите найти ошибку

Неактивен

 

#3 08.12.2010 17:45:27

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5833

Re: Группировка в запросе 2

maxtor написал:

В теме "Группировка в запросе" рассматривался интересный случай выборки групп с 3 потомками.

Если бы прочитали всю тему, то не писали бы ошибочный вариант запроса, приведенный в начале темы smile http://sqlinfo.ru/forum/viewtopic.php?pid=20267#p20267


maxtor написал:

не получилось задать LIMIT для групп, он считался для групп + потомки групп.

таблица_групп t1 => (select * from таблица_групп limit 10) t1 ??

Неактивен

 

#4 08.12.2010 19:30:07

maxtor
Участник
Зарегистрирован: 21.07.2010
Сообщений: 20

Re: Группировка в запросе 2

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

вывод такой:
http://i079.radikal.ru/1012/8f/a4431b2c0728.jpg
при объединении с таблицей 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

вывод такой:
http://s015.radikal.ru/i330/1012/8e/568d25f17a78.jpg
С чем это может быть связано?

Неактивен

 

#5 08.12.2010 19:40:36

maxtor
Участник
Зарегистрирован: 21.07.2010
Сообщений: 20

Re: Группировка в запросе 2

сама таблица `posts`:
http://i072.radikal.ru/1012/1a/8fca7ad3d20b.jpg

Неактивен

 

#6 08.12.2010 20:07:53

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5833

Re: Группировка в запросе 2

А что показывает запрос:
SELECT posts.*
FROM posts
LEFT JOIN users
ON users.id = posts.user_id
WHERE parent_post_id IN (30, 24, 21, 20, 19, 18);

Неактивен

 

#7 08.12.2010 20:17:32

maxtor
Участник
Зарегистрирован: 21.07.2010
Сообщений: 20

Re: Группировка в запросе 2

http://s012.radikal.ru/i321/1012/59/6236a4ea084f.jpg

Неактивен

 

#8 08.12.2010 20:26:50

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5833

Re: Группировка в запросе 2

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;

Неактивен

 

#9 10.12.2010 08:53:12

maxtor
Участник
Зарегистрирован: 21.07.2010
Сообщений: 20

Re: Группировка в запросе 2

vasya, спасибо!

Неактивен

 

#10 12.01.2011 11:08:37

nexus
Завсегдатай
Зарегистрирован: 26.11.2010
Сообщений: 35

Re: Группировка в запросе 2

У меня тоже что-то похожее надо сделать! Буду очень признателен если поможете!!!!
Имеется таблица категорий


CREATE TABLE IF NOT EXISTS `site_categories` (
  `cat_id` int(11) NOT NULL auto_increment,
  `parent_id` int(11) NOT NULL,
  `lang` enum('ru','en','ua') NOT NULL,
  `cat_name` varchar(50) NOT NULL,
  `content` text NOT NULL,
  `sort` tinyint(2) NOT NULL,
  `cat_link` varchar(50) NOT NULL,
  PRIMARY KEY  (`cat_id`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8  ;
 


И таблица статей:

CREATE TABLE IF NOT EXISTS `site_pages` (
  `page_id` smallint(5) NOT NULL auto_increment,
  `lang` enum('ru','en','ua') NOT NULL,
  `cat_id` smallint(5) NOT NULL default '0',
  `link` varchar(255) NOT NULL,
  `title` varchar(255) NOT NULL,
  `mkeys` text NOT NULL,
  `mdesc` text NOT NULL,
  `addtime` int(11) unsigned NOT NULL default '0',
  `name` varchar(255) NOT NULL,
  `preview` text NOT NULL,
  `content` longtext NOT NULL,,
  `views` int(11) NOT NULL,
  `sort` int(11) NOT NULL,
  `show` tinyint(1) NOT NULL
  PRIMARY KEY  (`page_id`),
  KEY `cat_id` (`lang`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=3168 ;
 


Как видно категории могут содержать не ограниченное количество подкатегорий!
Заметки закрепляются за категориями!

В моем случае  есть категория "Новости", которая содержит подкатегории "Футбол","Баскетбол","Хокей".
В свою очередь все эти подкатегории имеют свои подкатегории.

Вопрос заключаестя в том, как составить запрос, чтобы получить по 10 заметок для каждой подкатегории: "Футбол","Баскетбол","Хокей", учитывая все их вложенные категории?! Т.е. чтобы для каждой категории вывести по 10 заметок учитываю всю вложенность категории?!

Неактивен

 

#11 12.01.2011 12:14:19

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6756

Re: Группировка в запросе 2

Одним запросом это не делается. Можете, например, написать хранимую
процедуру, которая будет обходить дерево, или воспользоваться стандартной
денормализацией «все родители» (т.е. табличка, в которой будут id и parent,
при этом родители будут не только непосредственные, но и «дедушки» и т.д.).

Неактивен

 

#12 12.01.2011 12:27:59

nexus
Завсегдатай
Зарегистрирован: 26.11.2010
Сообщений: 35

Re: Группировка в запросе 2

paulus написал:

Одним запросом это не делается. Можете, например, написать хранимую
процедуру, которая будет обходить дерево, или воспользоваться стандартной
денормализацией «все родители» (т.е. табличка, в которой будут id и parent,
при этом родители будут не только непосредственные, но и «дедушки» и т.д.).

А можно набросать хоть примерный код хранимой процедуры?! Просто я никогда раньше не использовал их!

Неактивен

 

#13 12.01.2011 21:18:32

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6756

Re: Группировка в запросе 2

Неактивен

 

#14 21.04.2012 17:03:41

maxtor
Участник
Зарегистрирован: 21.07.2010
Сообщений: 20

Re: Группировка в запросе 2

Обновил 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)

Неактивен

 

#15 22.04.2012 03:01:30

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6756

Re: Группировка в запросе 2

Запросы с переменными могут ломаться, да. Скорее всего, поменялся план выполнения
запроса, и присвоение  производится в какой-то другой момент времени. Имеет смысл
смотреть в EXPLAIN.

Неактивен

 

#16 22.04.2012 10:55:58

maxtor
Участник
Зарегистрирован: 21.07.2010
Сообщений: 20

Re: Группировка в запросе 2

А можете подсказать, как теперь нужно правильно составить запрос?

Неактивен

 

#17 22.04.2012 11:54:23

maxtor
Участник
Зарегистрирован: 21.07.2010
Сообщений: 20

Re: Группировка в запросе 2

Вроде нашел:

Код:

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

Верен данный подход?

Неактивен

 

#18 23.04.2012 01:47:29

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6756

Re: Группировка в запросе 2

Если работает, то да smile

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson