1

mysql について質問があります。すべてのサプライヤーの詳細とその製品 (サプライヤーごとにランダムに 3 つの製品を選択) のリストを必要とするサプライヤー ページを作成しているため、2 つのテーブルを結合する必要があります。1 つはサプライヤーです。もう 1 つは製品です。単一の mysql ステートメントで製品を提示する方法を教えてください。

table1 - サプライヤー

id      corp_name      product_count
---------------------------------------
AD0728   John Smith     187
AD0729   JayJay         1983

table2 - 製品

pid      cid        p_name      quantity
---------------------------------------
1      AD0728     Body Shampoo     10
2      AD0728     glass            10
3      AD0728     pen              10
4      AD0728     pencil           10
5      AD0728     eraser           10
6      AD0728     speaker          10
7      AD0729     monitor          10
8      AD0729     keyboard         10
9      AD0729     mouse            10
10     AD0729     processor        10
11     AD0729     box              10
12     AD0729     sunglass         10

出力

id      corp_name      pid          p_name          quantity
----------------------------------------------------------------
AD0728   John Smith     1           Body Shampoo       10
AD0728   John Smith     2           glass              10
AD0728   John Smith     3           pen                10
AD0729   JayJay         10          processor          10
AD0729   JayJay         11          box                10
AD0729   JayJay         12          sunglass           10

みんな、ありがとう。

4

3 に答える 3

6

SQL Server 2005 以降ORDER BY NEWID()では、ランダムな順序に使用ROW_NUMBERでき、パーティションを取得するために使用できます。

WITH CTE AS
(
   SELECT 
       s.id, s.corp_name, p.pid, p.p_name, p.quantity
     , RN = ROW_NUMBER() OVER (PARTITION BY s.id ORDER BY NEWID())
    FROM suppliers s
    INNER JOIN products p ON s.id = p.cid
)
SELECT id, corp_name, pid, p_name, quantity
FROM CTE WHERE RN <= 3

これがフィドルです(@MahmoudGamalに感謝):http://www.sqlfiddle.com/#!3/a26c6/17/0

于 2012-11-12T13:51:35.970 に答える
1

MYSQL ではこれが機能します: http://sqlfiddle.com/#!2/8b291/10

SET @rank=0;
SELECT *, @rank:=@rank+1 AS rank
FROM suppliers s
LEFT JOIN products p ON p.cid = s.id
GROUP BY s.id, @rank % 3
于 2012-11-12T14:17:18.893 に答える
1

このSQL Fiddle コードを確認してください。要求に応じて、各サプライヤーの最初の 3 つの製品が返されます。SQL2005で導入されたCTE ( Common Table Expressions ) を使用するため、SQL2005 以降で機能します。

いずれにせよ、コードは次のとおりです。

;WITH myCTE AS (
 SELECT p.*, ROW_NUMBER() OVER (PARTITION BY p.cid ORDER BY NEWID()) AS r
   FROM products p)
SELECT sup.id,sup.corp_name,c.pid,c.p_name,c.quantity
  FROM myCTE c JOIN suppliers sup ON c.cid = sup.id
 WHERE c.r <= 3
于 2012-11-12T14:07:56.040 に答える