Php 一个简单的mySQL语句

Php 一个简单的mySQL语句,php,mysql,Php,Mysql,我有一个关于mysql的问题要问,我正在创建一个供应商页面,它需要列出所有供应商的详细信息和他们的产品,为每个供应商随机选择3个产品,因此我们必须将两个表连接在一起,一个是供应商,另一个是产品,我可以知道如何在单个mysql语句中显示它们吗 表1-供应商 表2-产品 输出 谢谢大家。对于SQL Server 2005或更高版本,您可以使用ORDER BY NEWID进行随机排序,也可以使用ROW_NUMBER获得您的分区: WITH CTE AS ( SELECT s.id

我有一个关于mysql的问题要问,我正在创建一个供应商页面,它需要列出所有供应商的详细信息和他们的产品,为每个供应商随机选择3个产品,因此我们必须将两个表连接在一起,一个是供应商,另一个是产品,我可以知道如何在单个mysql语句中显示它们吗

表1-供应商 表2-产品 输出
谢谢大家。

对于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:

对于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的小提琴:

检查这个。它将按要求退回每个供应商的前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
看看这个。它将按要求退回每个供应商的前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
在这种情况下:

在这种情况下:



什么是RDBMS?SQL Server?MySQL?神谕那会有所不同的请告诉我们你到目前为止都做了些什么?向我们展示您的代码,然后我们可能会帮助您。对于SQL Server 2005或更高版本,请参阅:复制抱歉,我犯了一个错误,它是mysql,不是SQL,因此很抱歉犯了这个错误。。。嗨,Fahim Parkar,我不知道怎么写这个声明,对不起,什么是RDBMS?SQL Server?MySQL?神谕那会有所不同的请告诉我们你到目前为止都做了些什么?向我们展示您的代码,然后我们可能会帮助您。对于SQL Server 2005或更高版本,请参阅:复制抱歉,我犯了一个错误,它是mysql,不是SQL,因此很抱歉犯了这个错误。。。嗨,Fahim Parkar,我不知道怎么写这个语句,对不起,我想你的表前缀和字段名有点搞错了。这应该是可行的:当CTE为SELECT s.id、s.corp_name、p.pid、p.p_name、p.quantity、RN=按s.id划分的行数、按供应商内部联接产品的NEWID订购的行数、s.id=p.cid SELECT id、corp_name、pid、p_name、来自CTE的数量,其中RN检查您的联接,我认为字段名称仍然是颠倒的。s/b:s.id=p上的内部联接产品p。cid@TimSchmelter:谢谢你的帮助,但是你在mysql中有这个声明吗?请在第一时间标记你的rdbms。看看Varon的答案。我想你的表前缀和字段名有点搞错了。这应该是可行的:当CTE为SELECT s.id、s.corp_name、p.pid、p.p_name、p.quantity、RN=按s.id划分的行数、按供应商内部联接产品的NEWID订购的行数、s.id=p.cid SELECT id、corp_name、pid、p_name、来自CTE的数量,其中RN检查您的联接,我认为字段名称仍然是颠倒的。s/b:s.id=p上的内部联接产品p。cid@TimSchmelter:谢谢你的帮助,但是你在mysql中有这个声明吗?请在第一时间标记你的rdbms。看看Varon的答案。谢谢Varon,我曾尝试在phpmyadmin中运行它,但它似乎不起作用……你知道为什么吗?在我自己的phpmyadmin中它也起作用。也许您有旧版本的mysql服务器或phpmyadmin?a=1时的工作集;选择@a?错误是MySQL返回了一个空的结果集,即零行。该结果只适用于分组,简单地说,我想要的是每个供应商3个产品,但结果只是每个供应商列出1个产品,我的phpmyadmin是2.11.2.1,是旧版本吗?是的。这是旧的。这里有一个用于测试的在线phpmyadmin:。点击SQL,在查询中写入:使用ranktest;设置@rank=0;SELECT*,@rank:=…谢谢Varon,我曾尝试在phpmyadmin中运行它,但它似乎不起作用…你知道为什么吗?在我自己的phpmyadmin中它也起作用。也许您有旧版本的mysql服务器或phpmyadmin?a=1时的工作集;选择@a?错误是MySQL返回了一个空的结果集,即零行。该结果只适用于分组,简单地说,我想要的是每个供应商3个产品,但结果只是每个供应商列出1个产品,我的phpmyadmin是2.11.2.1,是旧版本吗?是的。这是旧的。这里有一个用于测试的在线phpmyadmin:。点击SQL,在查询中写入:使用ranktest;设置@rank=0;选择*,@rank:=。。。
;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
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