[MySQL] Сложный непонятный запрос

rtyug
На сайте с 13.05.2009
Offline
263
679

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

есть

таблица: 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

Спалил тему: Pokerstars вывод WMZ, etc на VISA 0% или SWIFT + Конверт USD/GBP,etc (net profit $0,5 млрд) (https://minfin.com.ua/blogs/94589307/115366/) Monobank - 50₴ на счет при рег. тут (https://clck.ru/DLX4r) | Номер SIP АТС Москва 7(495) - 0Ꝑ, 8(800) - 800Ꝑ/0Ꝑ (http://goo.gl/XOrCSn)
D
На сайте с 14.01.2007
Offline
153
#1

1) SELECT content.* FROM content JOIN photo_albums ON content.id_co=photo_albums.id_co ORDER BY content.id_co DESC

?

rtyug
На сайте с 13.05.2009
Offline
263
#2

сделал!


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

rtyug
На сайте с 13.05.2009
Offline
263
#3

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

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

НО я сделал запрос в котором вывел 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


полностью, на 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;



Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий