我有两个表:[TEXT]、[CATEGORY] 其中每个文本项都有一个类别以下 sql 语句检索具有“艺术”类别的文本项
SELECT * from [TEXT], [CATEGORY] WHERE [CATEGORY].[id]=[TEXT].[CATEGORY_id] AND
[CATEGORY].[name] IN ("Art") LIMIT 10
我想做的是从每个类别中检索 10 个文本项。
10个来自艺术,10个来自哲学,10个来自科学......
我有两个表:[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 不保证分配 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
。
试试这个:
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
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