SQLinfo.ru - Все о MySQL

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

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

Вы не зашли.

#1 27.10.2010 13:36:01

Street85
Участник
Зарегистрирован: 17.10.2010
Сообщений: 9

как реализовать такой запрос

День добрый, помогите реализовать сложный запрос.

Есть 3-и таблицы

groups: (id, title, content)
projects: (id, group_id, title, content )
images: (id, project_id, thumbnail)

Как составить запрос который сформирует массив группы, в каждой группе будет массив из последние 9 проектов принадлежащей группе (group_id), в каждом проекте последнее изображение принадлежащее проекту(project_id).

реализовал это на php но понимаю что это не то...

   function get_groups() {
        $groups = $this->db->query('SELECT * FROM groups ORDER BY id');
        $g = 0;
        $array = NULL;
        foreach ($groups->result() as $row_g):
            $ob_group = new stdClass;
            $ob_group->title = $row_g->title;
            $ob_group->content = $row_g->content;
            $projects = $this->db->query('SELECT * FROM projects WHERE group_id="'.$row_g->id.'" ORDER BY date DESC LIMIT 9');
            $p = 0;
            $array_projects = NULL;
            foreach ($projects->result() as $row_p):
                $ob_project = new stdClass;
                $ob_project->title = $row_p->title;
                $images = $this->db->query('SELECT * FROM images WHERE project_id="'.$row_p->id.'" ORDER BY pos LIMIT 1');
                $ob_project->thumbnail = $images->row()->thumbnail;                
                $array_projects [$p] = $ob_project;
                $p++;
            endforeach;
            $ob_group->projects = $array_projects;
            $array[$g] = $ob_group;
            $g++;
        endforeach;
        return $array;
    }


спасибо.

Неактивен

 

#2 27.10.2010 14:04:03

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

Re: как реализовать такой запрос

Неактивен

 

#3 27.10.2010 16:43:25

Street85
Участник
Зарегистрирован: 17.10.2010
Сообщений: 9

Re: как реализовать такой запрос

Почемуто у меня ошибка:

SET @n=4, @i=0, @p=0;
SELECT * FROM groups JOIN items ON groups.id=items.group_id WHERE @i<=@n AND IF(@p=x, @i:=@i+1,(@i:=0) OR (@p:=x));
 


Error Number: 1054

Unknown column 'x' in 'where clause'

SELECT * FROM groups JOIN items ON groups.id=items.group_id WHERE @i<=@n AND IF(@p=x, @i:=@i+1,(@i:=0) OR (@p:=x));

Неактивен

 

#4 27.10.2010 21:58:47

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

Re: как реализовать такой запрос

А разве у вас в таблицах groups или items есть колонка x ??
Что вы хотите получить с помощью запроса?

Неактивен

 

#5 27.10.2010 23:16:25

Street85
Участник
Зарегистрирован: 17.10.2010
Сообщений: 9

Re: как реализовать такой запрос

В место x я подставляю groups.id но не получаю желанного результата (понимаю что пока без таблицы images)

Мне нужно получить такой массив:

Array
(
    [0] => stdClass Object
        (
            [title] => Дизайн
            [content] => уникальность во всём
            [projects] => Array
                (
                    [0] => stdClass Object
                        (
                            [title] => Bello pizza
                            [thumbnail] => /upload/images/projects/th/cdbct4y4.jpg
                        )

                    [1] => stdClass Object
                        (
                            [title] => Москонверспром
                            [thumbnail] => /upload/images/projects/th/8pf877gh.jpg
                        )

                    [2] => stdClass Object
                        (
                            [title] => imap
                            [thumbnail] => /upload/images/projects/th/1273846882_3z.jpg
                        )
                       
                )

        )

    [1] => stdClass Object
        (
            [title] => Промо-акции, BTL
            [content] => Продвижение товаров  и  услуг к потребителю
            [projects] => Array
                (
                    [0] => stdClass Object
                        (
                            [title] => Летняя площадка Саквояж
                            [thumbnail] => /upload/images/projects/th/1d7tvqyq.jpg
                        )

                    [1] => stdClass Object
                        (
                            [title] => YAX! London
                            [thumbnail] => /upload/images/projects/th/1273844352_ai.jpg
                        )

                    [2] => stdClass Object
                        (
                            [title] => Royal Canin
                            [thumbnail] => /upload/images/projects/th/1274199362_j8.jpg
                        )

                    [3] => stdClass Object
                        (
                            [title] => Terranova
                            [thumbnail] => /upload/images/projects/th/1273849606_wz.jpg
                        )

                )

        )

............
............
............
 

Неактивен

 

#6 27.10.2010 23:45:11

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

Re: как реализовать такой запрос


test >select * from projects;
+----+----------+-------------------------+---------+
| id | group_id | title                   | content |
+----+----------+-------------------------+---------+
|  1 |        1 | Bello pizza             |         |
|  2 |        2 | Летняя площадка Саквояж |         |
|  3 |        2 | YAX! London             |         |
|  4 |        2 | Royal Canin             |         |
|  5 |        2 | Terranova               |         |
|  6 |        1 | Москонверспром          |         |
+----+----------+-------------------------+---------+
6 rows in set (0.00 sec)

test >select @i:=0,@p:=0;
+-------+-------+
| @i:=0 | @p:=0 |
+-------+-------+
|     0 |     0 |
+-------+-------+
1 row in set (0.02 sec)

test >select * from (select * from projects order by group_id) t where if(@p=group_id,@i:=@i+1,(@i:=0) or (@p:=group_id)) and @i<3;
+----+----------+-------------------------+---------+
| id | group_id | title                   | content |
+----+----------+-------------------------+---------+
|  1 |        1 | Bello pizza             |         |
|  6 |        1 | Москонверспром          |         |
|  2 |        2 | Летняя площадка Саквояж |         |
|  3 |        2 | YAX! London             |         |
|  4 |        2 | Royal Canin             |         |
+----+----------+-------------------------+---------+
5 rows in set (0.01 sec)


Это пример, иллюстрирующий ситуацию, когда вы хотите выбрать по три любых проекта из каждой группы.

Неактивен

 

#7 28.10.2010 00:21:09

Street85
Участник
Зарегистрирован: 17.10.2010
Сообщений: 9

Re: как реализовать такой запрос

Спасибо Вам я понял, а возможно ли получить результат с подтаблицей, потому что в результате не присутствуют title и content из таблицы groups?

и не будет ли ошибки если group_id будут не по порядку например (7, 7, 18, 18, 18, 4, 4, 4, 4)

Неактивен

 

#8 28.10.2010 00:41:14

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

Re: как реализовать такой запрос

Street85 написал:

Спасибо Вам я понял, а возможно ли получить результат с подтаблицей, потому что в результате не присутствуют title и content из таблицы groups?

Не понял, что вы подразумеваете под терминов "подтаблица".
Чтобы в результате присутствовали нужные поля из таблицы groups, нужно выбирать не из таблицы projects, а из объединения (join) таблиц projects и groups.

А ещё лучше сначала выбрать id нужных проектов, а потом по ним выбирать все остальные данные. ( http://sqlinfo.ru/forum/viewtopic.php?pid=19785#p19785 )

Street85 написал:

и не будет ли ошибки если group_id будут не по порядку например (7, 7, 18, 18, 18, 4, 4, 4, 4)

Если вы внимательно посмотрите на приведенный мной пример, то увидите, что в исходных данных group_id идут не по порядку, и, именно, поэтому нужен подзапрос, в котором происходит их сортировка.

Неактивен

 

#9 31.10.2010 20:11:01

Street85
Участник
Зарегистрирован: 17.10.2010
Сообщений: 9

Re: как реализовать такой запрос

подтаблица - вложенная таблица

мне нужно выбрать все группы,

SELECT * FROM groups

а затем объеденить (join) projects и images
и вывести результат.

только вот уж неделю бьюсь ничего существенного не получилось.

Неактивен

 

#10 01.11.2010 20:51:00

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

Re: как реализовать такой запрос

Честно говоря, термин "вложенная таблица" не прояснил ситуацию, а последнее сообщение в целом так ещё более запутало.
Насколько я понял исходную задачу - нужно выбрать по 9 последних проектов из каждой группы, проекту должна соответствовать последняя картинка из принадлещащих данному проекту и текстовое описание группы. Если так, то механизм решения следующий:
1. из таблицы проектов выбираете нужные id проектов
2. таблицу проектов объединяете с группами и рисунками и по найденным в пункте первом id получаете нужную вам информацию.


Если нужно что-то иное (или не получается), то приводите тестовые данные по десятку строк на таблицу и желаемый результат выборки.

Неактивен

 

Board footer

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