3

我正在使用下面的查询来搜索标题中包含术语的产品。查询返回所需的结果(通常结果太多)。

现在我只希望它能够为每家公司选择最多 3 种(随机)产品。有些公司退回了很多记录/产品,但我只需要拿3个就可以转到下一家公司

SELECT p.title As entryname, cname 
FROM company c, product p
WHERE p.title LIKE '%steel%' AND p.cid = c.cid 
GROUP By cname, ca.title

我试图理解分区和排名,但我没有走得太远。我正在使用 ms sql

4

3 回答 3

7

您可以使用 ROW_NUMBER() 来执行此操作

with cte as (
SELECT 
    p.title as entryname, cname,
    ROW_NUMBER() OVER (PARTITION BY c.id ORDER BY p.id) rn
FROM company c
    INNER JOIN  product p 
    ON  p.cid = c.cid 
WHERE p.title LIKE '%steel%'
GROUP By cname, ca.title    
)
SELECT 
    p.title as entryname, cname,
FROM CTE where rn <= 3

如果您真的想要随机(而不是 ID 最低的 3 个),您可以将 row_number 行更改为

ROW_NUMBER() OVER (PARTITION BY c.id order by newid()) rn

于 2012-04-19T21:39:49.970 回答
0

如果您的数据库是 SQL Server(在您的帖子末尾使用 ms sql),请在 MSDN 上查找 TOP

SELECT TOP(3) p.title As entryname, cname 
FROM company c, product p
WHERE p.title LIKE '%steel%' AND p.cid = c.cid 
GROUP By cname, ca.title

对于 Oracle,您可以在 WHERE 子句中使用rownum :

SELECT p.title As entryname, cname 
FROM company c, product p
WHERE p.title LIKE '%steel%' AND p.cid = c.cid AND rownum < 4
GROUP By cname, ca.title
于 2012-04-19T21:38:36.987 回答
0

你可以简单地追加

limit 3,5

到您的查询结束。 例如,这将从第 3 行开始依次为您提供5行。

现在随机选择这 5 行是一种复杂的模式,我猜。

于 2012-04-19T21:43:31.573 回答