Грамотная выборка mysql. Вопрос знактокам

12
M
На сайте с 20.08.2004
Offline
376
947

Есть таблица разделов, есть таблица статей в разделе.

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

Самый примитивный способ это

1.SELECT cat_name, cat_id FROM cat

2. и потом в итерации делать SELECT * FROM article WHERE cat_id = $cat_id LIMIT 10

Но не хотелось бы плодить кучу, пусть не так много п2., хоть данные и кешируются в файл.

Подскажите пожалуста как сделать грамотней?!

Спасибо.

отец сыночка, лапочки дочки и еще одного сыночка
C
На сайте с 04.02.2005
Offline
291
#1

select article.*

from article

left join cat on article.cat_id=cat.cat_id

M
На сайте с 20.08.2004
Offline
376
#2

чукча хитрый какой :)

это обычный запрос выборки.

а выбери-ка по 10 с каждой категории.

C
На сайте с 04.02.2005
Offline
291
#3

Пока писал ответ, уже и ТЗ поменялось. :(

все же проще пробегать по категориям...

M
На сайте с 20.08.2004
Offline
376
#4
Miracle:
Нужно выбрать из каждого раздела по 10 последний статей,

это было изначально.

DeveloperRu
На сайте с 27.02.2009
Offline
72
#5

попробуй так

SELECT t_n.*

FROM table_category AS t_c

LEFT JOIN table_news AS t_n

ON t_c.id=t_n.category_id

GROUP BY t_c.id, t_n.id

ORDER BY t_n.time DESC

LIMIT 10

Ответы на вопросы (http://telenok.com)
M
На сайте с 20.08.2004
Offline
376
#6

я попробую, но мне кажется что это запрос выведет всего 10 записей

Miracle добавил 19.08.2010 в 10:44

Miracle:
выведет всего 10 записей

как я и говорил, причем, запрос сложнее чем написал чукча, а по идее выведет тоже самое.

V
На сайте с 07.05.2008
Offline
16
#7

set @category_id = 0;

set @n = 0;

SELECT *, @n:=if(@category_id <> category_id, 1, @n:=@n+1), @category_id:=category_id FROM `test`

WHERE @n <= 10;

Хотя правильнее, наверное, будет вот так:

set @category_id = 0;

set @n = 0;

SELECT *, @n:=if(@category_id <> category_id, 1, @n:=@n+1), @category_id:=category_id FROM `test` WHERE 1

having @n <= 10

order by category_id

S
На сайте с 14.04.2008
Offline
60
#8

set @cat=''; set @num=0;


select cat,title,row_num from
(
select c.cat, a.title, id,
@num := if(@cat = cat, @num + 1, 1) as row_num,
@cat := cat as dummy
from _cat c join _article a on a.cat_id=c.cat_id
order by c.cat,a.title
) x
where x.row_num<=10;

Важно: такой запрос отберет не 10 последних статей в разделе, а 10 статей с "наименьшими" тайтлами. Чтобы отбирать именно 10 последних статей, вам нужно во вложенном запросе в ORDER BY вместо title (выделено красным) использовать соответствующее поле даты (или инкрементный айдишник) статьи и явное указание порядка сортировки.

M
На сайте с 20.08.2004
Offline
376
#9

спасибо., с @ еще запросов не писал сейчас буду пробовать.

seraphim:
а 10 статей с "наименьшими" тайтлами

я думаю это просто опечатка.

C
На сайте с 04.02.2005
Offline
291
#10

select article.*, cat.* from article, cat

where cat.cat_id in (select c.cat_id from cat c where article.cat_id=c.cat_id order by 1 limit 10)

12

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