一个简单的mySQL语句要问
Posted
技术标签:
【中文标题】一个简单的mySQL语句要问【英文标题】:A simple mySQL statement to ask 【发布时间】:2012-11-12 13:48:04 【问题描述】:我有一个关于 mysql 的问题要问,我正在创建一个供应商页面,该页面需要列出所有供应商的详细信息及其产品(为每个供应商随机选择 3 个产品),所以我们必须将 2 个表连接在一起,一个一个是供应商,一个是产品,请问我知道如何在单个 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
谢谢大家。
【问题讨论】:
什么关系型数据库? SQL 服务器? MySQL?甲骨文?这会有所作为 请向我们展示您到目前为止所做的尝试?向我们展示您的代码,我们可能会为您提供帮助。 对于 SQL Server 2005 或更高版本,请参阅:***.com/questions/3998573/… 重复***.com/questions/3140589/… 对不起,我犯了一个错误,是mysql,不是SQL,所以很抱歉犯了这个错误...... Hi Fahim Parkar,我不知道如何写这个语句,对不起跨度> 【参考方案1】:对于 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
【讨论】:
我认为你的表前缀和字段名有点搞砸了。这应该有效: 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()) 从供应商 s INNER JOIN products p ON s.id = p.cid ) SELECT id, corp_name, pid, p_name, quantity FROM CTE WHERE RN 检查你的加入,我认为字段名称仍然是颠倒的。 s/b:INNER JOIN 产品 p ON s.id = p.cid @Tim Schmelter:感谢您的热心帮助,但是您在 mysql 语句中有这个吗? 请在下次第一时间标记您的 rdbms。看看 Varon 的回答。【参考方案2】:检查此SQL Fiddle code。它将按要求返回每个供应商的前 3 个产品。它适用于 SQL2005 及更高版本,因为它使用 SQL2005 引入的 CTE (Common Table Expressions)。
不管怎样,代码如下:
;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
【讨论】:
【参考方案3】:在 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
【讨论】:
感谢 Varon,我曾尝试在 phpmyadmin 中运行它,但它似乎不起作用....你知道为什么吗? 在我自己的 phpmyadmin 中也可以。也许您有旧版本的 mysql-server 或 phpmyadmin?工作SET @a = 1; SELECT @a;
?
错误是#MySQL返回了一个空的结果集(即零行)。
结果只能按部分分组,简单来说,我想要的是每个供应商有 3 个产品,但结果只是为每个供应商列出 1 个产品,我的 phpmyadmin 是 2.11.2.1,是旧版本吗?
是的。这是旧的。这里有一个用于测试的在线 phpmyadmin:demo.phpmyadmin.net/STABLE/?pma_username=root。点击 SQL 并写入查询:use ranktest; SET @rank=0; SELECT *, @rank:= ...
以上是关于一个简单的mySQL语句要问的主要内容,如果未能解决你的问题,请参考以下文章