每个类别的MySQL限制结果
c_data中的每个项目都在一个类别/部分中。我想限制每个类别显示多少项目,而不是限制检索项目的总数。很显然,如果我在查询中添加“限制20”之类的内容,它只会总共获取20个结果,而不是每个类别的20个结果。每个类别的MySQL限制结果
SELECT cm.id,
cm.title AS cmtitle,
cm.sectionid,
cm.type AS cmtype,
cd.id,
cd.time,
cd.link,
cd.title,
cd.description,
cd.sectionid AS sectionid
FROM c_main AS cm
JOIN c_data AS cd ON cd.sectionid=cm.sectionid
WHERE cd.sectionid=cm.sectionid
ORDER by id ASC
该分类的字段是“sectionid”。
MySQL没有任何等级的功能,但你可以使用一个变量来创建一个伪行号。
用途:
SELECT x.*
FROM (SELECT cm.id,
cm.title AS cmtitle,
cm.sectionid,
cm.type AS cmtype,
cd.id AS cd_id,
cd.time,
cd.link,
cd.title,
cd.description,
cd.sectionid AS cd_sectionid,
CASE
WHEN @sectionid != cm.sectionid THEN @rownum := 1
ELSE @rownum := @rownum + 1
END AS rank,
@sectionid := cm.sectionid
FROM C_MAIN cm,
C_DATA cd,
(SELECT @rownum := 0, @sectionid := NULL) r
WHERE cm.sectionid = cd.sectionid
ORDER BY cm.sectionid) x
WHERE x.rank <= 20
ORDER BY id
我认为你在'END AS rank'之后缺少'''',如果sectionid没有排序,你的解决方案是否会工作? – 2010-01-04 17:39:05
即使在END AS排名后添加了逗号,也会给出语法错误。 – user242632 2010-01-04 17:45:31
缺少两个逗号 - 'cd.sectionid AS sectionid,',以及'AS rank'后 – 2010-01-04 18:14:12
这个previous post的答案应该可以帮助你解决这个问题。
编辑:
应该用row numbers工作。
我还没有尝试过,但是这应该工作:
set @section = '';
set @num = 1;
SELECT y.*
FROM
(
SELECT
x.*,
@num := if(@section = sectionid, @num + 1, 1) as row_number,
@section := sectionid
FROM
(
SELECT
cm.id AS cm_id,
cm.title AS cmtitle,
cm.sectionid,
cm.type AS cmtype,
cd.id AS cd_id,
cd.time,
cd.link,
cd.title,
cd.description
FROM c_main AS cm
JOIN c_data AS cd ON (cd.sectionid=cm.sectionid)
ORDER by cd.sectionid ASC, cm.id ASC
) x
) y
WHERE y.row_number <= 20;
问题的最初意图是采取最后15行,而不是几天。旁观者的回答指向使用rownumbers。尽管如此,我会提供更好的答案,除非你打败我;-) – 2010-01-04 17:13:08
@OMG小马:谢谢,我纠正了这一点。 – 2010-01-04 18:31:00
+1:这毕竟是你的算法,我只是在实现它的时候更快。 – 2010-01-04 18:40:42
被列入它。 c_main表包含5个类别,而c_data表包含与这些类别对应的信息。大多数类别的数据(在c_data中)有5-10个项目,其中一个目前有80个项目。 – user242632 2010-01-04 19:11:14
@nsan:需要该数据 – 2010-01-04 19:25:56
http://pastebin.ca/1737829 – user242632 2010-01-04 20:24:38