一个简单的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语句要问的主要内容,如果未能解决你的问题,请参考以下文章

MySQL的简单查询语句

简单选择语句的where子句中的MySQL未知列

Springboot接口简单实现生成MySQL插入语句

MySQL入门很简单-触发器

php mysql 一个查询优化的简单例子

mysql简单语句