5 статей из каждой категории одним SQL кодом

iceman

говнокодер
5 статей из каждой категории одним SQL кодом

Здравствуйте,

не могу сообразить как выбрать, например, 5 статей и каждой категории одним SQL кодом

в таблице статей есть fk_catalog указывающий на категорию

-~{}~ 28.07.08 09:41:

помогите +) работу нада щас сдать, а это единственный касяк с каторым справится не могу +(
 

scandal

Новичок
select ctgr, item, no
from
(SELECT COUNT(*) no,P2.id, p2.ctgr,p2.item
FROM test P1 JOIN test P2
ON P1.id <= P2.id and p1.ctgr=p2.ctgr
GROUP BY P2.id)t
where no<6
только, пожалуйста, сообщи помогло или нет
 

berkut

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

scandal

Новичок
berkut, а Вы проверили мой вариант?
iceman, если не сможете применить, дайте, пожалуйста, структуру своей таблицы. подгоню.
 

berkut

Новичок
scandal нет. я так. SELECT (.. COUNT(*) AS no..) WHERE no < 6
этот запрос выдаст категории, где меньше шести статей
 

scandal

Новичок
Нумерую каждую статью в категории, смотрю, если номер меньше 6, то вывожу.
Нужно ведь по 5 статей в категории?
Может хоть кто-нибудь проверит и потом будете хаять?
 

Gas

может по одной?
Нужно ведь по 5 статей в категории?
5 статей, но обычно нужны последние 5 статей, а не первые.
Твой запрос имеет право на существование как теоритическое решение задачи, так же как и такой:

Код:
SET @ctgr_tmp=0, @i=1;
SELECT * 
FROM 
(
  SELECT *, (IF(ctgr=@ctgr_tmp, @i:=@i+1, LEAST(@ctgr_tmp:=ctgr, @i:=1))) AS num 
  FROM test 
  ORDER BY ctgr, id DESC
) AS t 
WHERE num<=2;
но на сколько нибудь серьёзном наборе данных лучше union (и индексами правильными конечно).
 

iceman

говнокодер
Gas
что надо поправить чтобы он 5 выдавал из каждой категории?

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

scandal
я не могу понять твой код...

-~{}~ 28.07.08 16:07:

select *
from
(SELECT p1.id as id, p2.id as cid,COUNT(*) as no
FROM content as P1
JOIN catalog as P2
ON P1.fk_content_catalog = P2.id
GROUP BY P2.id) as f
where no<6

чето он не выводит по 5 статей в одной группе, в бд данные есть!
 

scandal

Новичок
http://sqlbooks.ru/printarticle.aspx?part=09&file=addition03
может это поможет понять.
но вы переделали неправильно.
дайте структуру обеих таблиц. я попробую передалать
 

iceman

говнокодер
Автор оригинала: scandal
http://sqlbooks.ru/printarticle.aspx?part=09&file=addition03
может это поможет понять.
но вы переделали неправильно.
дайте структуру обеих таблиц. я попробую передалать
DROP TABLE IF EXISTS `racms_modules_content`;
CREATE TABLE `racms_modules_content` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`fk_content_catalog` int(10) unsigned NOT NULL,
`title` varchar(255) NOT NULL,
`text` text NOT NULL,
`add_date` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
`keywords` text,
PRIMARY KEY (`id`),
KEY `FK_content_1` (`fk_content_catalog`),
CONSTRAINT `FK_content_1` FOREIGN KEY (`fk_content_catalog`) REFERENCES `racms_modules_content_catalog` (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=16 DEFAULT CHARSET=utf8;

DROP TABLE IF EXISTS `racms_modules_content_catalog`;
CREATE TABLE `racms_modules_content_catalog` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`catalog_name` varchar(255) NOT NULL,
`default_cat` tinyint(1) unsigned DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=19 DEFAULT CHARSET=utf8;
 

scandal

Новичок
SELECT fk_content_catalog, text, no
FROM (
SELECT COUNT( * ) no, P2.id, p2.fk_content_catalog, p2.text
FROM racms_modules_content P1
JOIN racms_modules_content P2 ON P1.id <= P2.id
AND p1.fk_content_catalog = p2.fk_content_catalog
GROUP BY P2.id
)t
WHERE no <6
 

Wicked

Новичок
scandal
ты знаешь, что такое having, и его основное отличие от where?
 

scandal

Новичок
знаю я про having.

SELECT COUNT( * ) no, P2.id, p2.fk_content_catalog, p2.text
FROM racms_modules_content P1
JOIN racms_modules_content P2 ON P1.id <= P2.id
AND p1.fk_content_catalog = p2.fk_content_catalog
GROUP BY P2.id
HAVING no<6

-~{}~ 30.07.08 09:12:

А-а! Wicked - местный авторитет и модератор! Понял :)
 

Agent

Новичок
scandal сталкнулся с такой же проблемой, попробовал твой запрос, он медленный просто ужасно, у меня порядка 300 000 записей, запрос выполняется порядка 2х секунд... хотя пачка отдельных запросов выполняется за 0,09, пробовал UNION скорость упала до 0,15
 
Сверху