Модераторы: skyboy
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Сложный непонятный запрос 
V
    Опции темы
gcc
Дата 6.5.2011, 12:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Агент алкомафии
****


Профиль
Группа: Участник
Сообщений: 2691
Регистрация: 25.4.2008
Где: %&й

Репутация: 3
Всего: 17



хочу написать запрос, но не могу понять

есть
таблица: content
столбцы: id_co, name_co

таблица: photo_albums
столбцы: id_pa, name_pa,id_co

таблица: photo_files
столбцы: id_pf, name_pf,id_pa


1) хотел вывести все с конца с таблицы content, при условии что есть в photo_albums соответстующие id_co
2) и вывести первые 8 id_pa с photo_albums которые соответсвуют данному id_co с content 
3) и самую первую и самую последую с photo_files по id_pf соответстующим id_pa (это я сам могу, вопрос как сделать, то что выше п1 и п2)

пробовал, но не получается, сделать именно так как я хочу:
Код


select a.id_co,
         a.id_pa,  
         a.created,
         a.id_pf_min,
         a.id_pf_max

 FROM ( SELECT
         t1.id_co,
         t1.id_pa,
         t1.created,

         (SELECT min(t6.id_pf) FROM photo_files AS t6 WHERE t6.id_pa = t1.id_pa) as id_pf_min,                                             
        (SELECT MAX(t7.id_pf) FROM photo_files AS t7 WHERE t7.id_pa = t1.id_pa ) as id_pf_max  
                                         
         FROM photo_albums AS t1  
  LEFT JOIN content AS t2
         ON t1.id_co = t2.id_co                              
      WHERE (SELECT min(t67.id_pf) FROM photo_files AS t67 WHERE t67.id_pa = t1.id_pa  ) > 0
   GROUP BY t1.id_co, t1.id_pa
   ORDER BY t1.created desc
      LIMIT 100
        ) as `a`
 INNER JOIN content as t33
           ON t33.id_co = `a`.id_co
     HAVING Count(a.id_co)<=10







Это сообщение отредактировал(а) gcc - 6.5.2011, 12:22
PM WWW ICQ Skype GTalk Jabber   Вверх
gcc
Дата 6.5.2011, 17:00 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Агент алкомафии
****


Профиль
Группа: Участник
Сообщений: 2691
Регистрация: 25.4.2008
Где: %&й

Репутация: 3
Всего: 17



что-то не хочет никак, даже, как бы самый легкий:

Код

select
n.id_co
from
(
  select
   id_co
  from
    content
  order by
   created desc
  limit 10
) as `n`
inner join
(
select
  id_co
from
  photo_albums


) as com 
  on `n`.id_co = com.id_co



Это сообщение отредактировал(а) gcc - 6.5.2011, 17:01
PM WWW ICQ Skype GTalk Jabber   Вверх
gcc
Дата 7.5.2011, 00:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Агент алкомафии
****


Профиль
Группа: Участник
Сообщений: 2691
Регистрация: 25.4.2008
Где: %&й

Репутация: 3
Всего: 17



сделал!

Код

SELECT d.id_co,
d.id_pa  from (
select

n.id_co,
e.id_pa

FROM content as n

LEFT JOIN (
select
  id_co,id_pa
from
  photo_albums

limit 10
)  as c
ON c.id_co = n.id_co

INNER JOIN (
select
  id_co,id_pa
from
  photo_albums

limit 10
)  as e
ON n.id_co = e.id_co AND c.id_pa < e.id_pa
  order by created desc

) `a`
 JOIN (
select
 id_co,id_pa
 from  photo_albums
  where id_co in (SELECT id_co from photo_albums)
   limit 50
) as d

ORDER by d.id_co desc




вывод:
Код

+-------+-------+
| id_co | id_pa |
+-------+-------+
|   120 |    87 | 
|   120 |    88 | 
|   120 |    90 | 
|   120 |    91 | 
|   119 |    74 | 
|   118 |    71 | 
|   118 |    72 | 
|   118 |    75 | 
|   118 |    76 | 
|   118 |    77 | 
|   118 |    78 | 
|   117 |    89 | 
|   117 |    25 | 
|   117 |    26 | 
|   116 |    73 | 
|   115 |    34 | 
|   115 |    42 | 
|   115 |    79 | 
|   113 |    85 | 
|   113 |    86 | 
|   113 |    59 | 
|   113 |     9 | 
|   113 |    61 | 
|   113 |    48 | 
|   113 |    49 | 
|   113 |    50 | 
|   113 |    52 | 
|   113 |    80 | 
|   113 |    53 | 
|   113 |    81 | 
|   113 |    82 | 
|   113 |    83 | 
|   113 |    84 | 
|   112 |    45 | 
|   111 |    60 | 
|   110 |    62 | 
|   110 |    44 | 
|   109 |    58 | 
|   109 |    54 | 
|   109 |    55 | 
|   109 |    56 | 
|   109 |    57 | 
|   107 |    63 | 
|   106 |    64 | 
|    67 |    10 | 
|    66 |     3 | 
|    66 |    12 | 
|    66 |    13 | 
|    47 |     2 | 
|    47 |     5 | 
+-------+-------+
50 rows in set (0.00 sec)





работает как надо!


ВОПРОС:

хотел сделать еще по другому, чтобы в выводе было максимум 10 уникальных id_co c таблицы content
т.е. хочу сделать по страничный вывод и чтобы было максимум 10 id_co на странице (ну и к нему привязано какое-то количество id_pa, см.условие)

вот никак не могу понят ькуда прикрутить LIMIT, чтобы было  10 уникальных id_co



Это сообщение отредактировал(а) gcc - 7.5.2011, 00:04
PM WWW ICQ Skype GTalk Jabber   Вверх
gcc
Дата 10.5.2011, 12:53 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Агент алкомафии
****


Профиль
Группа: Участник
Сообщений: 2691
Регистрация: 25.4.2008
Где: %&й

Репутация: 3
Всего: 17



короче, это все порнография

не получилось ничего

НО я сделал запрос в котормо вывел 10 элементов:
Код

 select t1.id_co  
       from content AS t1
 INNER join photo_albums as t2
        ON t1.id_co = t2.id_co
 INNER join photo_files as t3
        ON t2.id_pa = t3.id_pa
        
        GROUP BY t1.id_co 
        ORDER BY t2.created desc
LIMIT 10



а потом сконструировал такой:

Код

( select t1.id_pa,
                         t1.id_co,
   (SELECT min(t6.id_pf) FROM photo_files AS t6 WHERE t6.id_pa = t1.id_pa) as id_pf_min,                                             
        (SELECT MAX(t7.id_pf) as pf FROM photo_files AS t7 WHERE t7.id_pa = t1.id_pa ) as id_pf_max  
                                
       from photo_albums AS t1
    where t1.id_co = '666'
    ORDER by t1.id_co desc
    limit 5

 UNION ALL

( select t1.id_pa,
                         t1.id_co,
   (SELECT min(t6.id_pf) FROM photo_files AS t6 WHERE t6.id_pa = t1.id_pa) as id_pf_min,                                             
        (SELECT MAX(t7.id_pf) as pf FROM photo_files AS t7 WHERE t7.id_pa = t1.id_pa ) as id_pf_max  
                                
       from photo_albums AS t1
    where t1.id_co = '667'
    ORDER by t1.id_co desc
    limit 5

и т.д. всего 10 по  t1.id_co  (    where t1.id_co = '667' )



полностью, на perl:
Код


my $a = $DBH->selectall_arrayref("

     select t1.id_co  
       from content AS t1
 INNER join photo_albums as t2
        ON t1.id_co = t2.id_co
 INNER join photo_files as t3
        ON t2.id_pa = t3.id_pa
        
        GROUP BY t1.id_co 
        ORDER BY t2.created desc

", { Slice => {} } );



 my $sql_p = join " UNION ALL ", map {"( select t1.id_pa,
                         t1.id_co,
   (SELECT min(t6.id_pf) FROM photo_files AS t6 WHERE t6.id_pa = t1.id_pa) as id_pf_min,                                             
        (SELECT MAX(t7.id_pf) as pf FROM photo_files AS t7 WHERE t7.id_pa = t1.id_pa ) as id_pf_max  
                                
       from photo_albums AS t1
    where t1.id_co = ".$_->{id_co}."
    ORDER by t1.id_co desc
    limit 5 ) " } @$a;


my $aa = $DBH->selectall_arrayref( $sql_p, { Slice => {} } );


@{$c->stash->{photo_new}} = map { {%$_ }} @$aa; 





Это сообщение отредактировал(а) gcc - 10.5.2011, 15:12
PM WWW ICQ Skype GTalk Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | MySQL | Следующая тема »


 




[ Время генерации скрипта: 0.0462 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.