1

我有一个关于 mysql 的问题要问,我正在创建一个供应商页面,该页面需要列出所有供应商的详细信息及其产品(为每个供应商随机选择 3 个产品),所以我们必须将 2 个表连接在一起,一个是供应商,另一个是产品,我可以知道如何在单个 mysql 语句中呈现它们吗?

表 1 - 供应商

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

表 2 - 产品

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 及更高版本,因为它使用 SQL2005 引入的 CTE(公用表表达式)。

无论哪种方式,这里是代码:

;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 回答