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 に答える