我有两个表格:[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

09-11 19:32
查看更多