我有两个表格:[TEXT],[CATEGORY]
每个文本项都有一个类别
以下sql语句检索具有“艺术”类别的文本项
SELECT * from [TEXT], [CATEGORY] WHERE [CATEGORY].[id]=[TEXT].[CATEGORY_id] AND
[CATEGORY].[name] IN ("Art") LIMIT 10
我要做的是从每个类别中检索10个文本项。
艺术类10名,哲学类10名,科学类10名...
最佳答案
假设您确实是说MySQL,最快的解决方案涉及变量:
select t.*
from (SELECT *,
@rn := if(@cname = c.name, @rn + 1, 1) as rn
@cname := c.name
from `TEXT` t join
CATEGORY c
on c.id = t.CATEGORY_id cross join
(select @cname := '', @rn := 0) const
order by c.name
) t
where rn <= 10;
我特别不喜欢这种解决方案,因为MySQL不保证对
@rn
的赋值会先于对@cname
的赋值。但是,它确实可以工作。编辑:
以上适用于MySQL。在SQLite中,您需要使用查询进行计数:
select t.*
from (SELECT *,
(select count(*) from Text t2 where t2.Category_id = t.Category_Id and t2.id <= t.id
) as seqnum
from TEXT t join
CATEGORY c
on c.id = t.CATEGORY_id
) t
where seqnum <= 10;
这实际上是标准的SQL,但是通常性能不是很好,因此首选其他替代方法。
注意:这假定
Text
中有一些标识每一行的列。我称它为id
。