2

我有两个表:[TEXT]、[CATEGORY] 其中每个文本项都有一个类别以下 sql 语句检索具有“艺术”类别的文本项

SELECT * from [TEXT], [CATEGORY] WHERE [CATEGORY].[id]=[TEXT].[CATEGORY_id] AND
[CATEGORY].[name] IN ("Art") LIMIT 10

我想做的是从每个类别中检索 10 个文本项。

10个来自艺术,10个来自哲学,10个来自科学......

4

3 回答 3

3

假设您确实是指 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 不保证分配 to@rn发生在分配 to 之前@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

于 2013-07-28T17:19:27.073 回答
0

试试这个:

SELECT
    CATEGORY.NAME,
    @curRank := @curRank + 1 AS rank,
    TEXT.NAME    
FROM TEXT 
JOIN ( select NAME.ID, @curRank := 0 from CATEGORY) CATEGORY
       ON CATEGORY.ID = TEXT.ID
) CATEGORY
  ON CATEGORY.ID = TEXT.ID
WHERE rank <= 10
ORDER BY 
    CATEGORY.NAME,
    rank
于 2013-07-28T17:12:20.223 回答
0
    SELECT * FROM [CATEGORY] 
    JOIN (SELECT [TEXT].[CATEGORY_id], 
    IF( @previous = [TEXT].[CATEGORY_id],
          @temp := @temp + 1, @temp := 1) cnt, 
          @previous := [TEXT].[CATEGORY_id] 
    FROM  [TEXT] ORDER BY [TEXT].[CATEGORY_id] ) t 
    WHERE [CATEGORY].[id]= t.[CATEGORY_id] AND
    [CATEGORY].[NAME] IN ("Art") and cnt <= 10
于 2013-07-28T17:35:07.667 回答