我试图 Select 不同的产品,按除ID外的所有列分组,并为该类型的产品出价最低.有时,可能没有该产品的出价,所以我需要离开加入来说明这些.

我将在下面添加所需的输出,并添加一种伪查询来帮助解释.

如果它有帮助,你可以想象一个产品搜索页面.当用户搜索时,它会将所有相同的产品分组在一起.这些产品可以由许多不同的卖家销售,但我们只想在搜索结果中显示一次,以及搜索时该产品的最便宜价格.

Data I want returned

SELECT count(Name), Size, Weight, Color, BidID, Status, min(Price)
-- joins go here --
-- group by Size, Weight, Color, BidID, Status

还需要WHERE子句,这些子句基于最终用户使用的筛选器构建.例如:

WHERE Status = 'Active' and Weight = '1kg'
WHERE Status = 'Active'
WHERE Size = '1m' and Weight in ('1kg', '2kg')

Products Table

| ProductID (PK) | Name        | Size | Weight | Color  |
| --------       | --------    | -----| -----  | -----  | 
| 1              | Black Table | 1m   | 2kg    | Black  | 
| 2              | Purple Table| 1m   | 3kg    | Purple | 
| 3              | Small Table | 1m   | 3kg    | Black  | 
| 4              | Small Table | 1m   | 3kg    | Black  | 
| 5              | Black Table | 1m   | 2kg    | Black  | 
| 6              | Purple Table| 1m   | 3kg    | Purple |
| 7              | Small Table | 1m   | 3kg    | Black  | 
| 8              | Small Table | 1m   | 3kg    | Black  | 

Bids Table

| BidID (PK)     | ProductID   | Status      | Price   |
| --------       | -------     | --------    | -----   |
| 1              |  1          | Active      | 123.5   |
| 2              |  1          | Active      | 325.99  |
| 3              |  1          | Active      | 85.99   |
| 4              |  3          | Cancelled   | 315.99  |
| 5              |  4          | Active      | 113.5   |
| 6              |  3          | Cancelled   | 305.99  |
| 7              |  1          | Active      | 82.99   |
| 8              |  2          | Active      | 345.99  |

DESIRED OUTPUT EXAMPLE

| Count          | Name        | Size | Weight | Color  | BidID |CheapestPrice |
| --------       | --------    | -----| -----  | -----  | ----- | -----     |
| 38             | Black Table | 1m   | 2kg    | Black  |  1    | 123.5
| 21             | Purple Table| 1m   | 3kg    | Purple |  2    | 89.95
| 13             | Small Table | 1m   | 3kg    | Black  |  3    | 65.94

推荐答案

假设您有版本8或更高版本(现在应该是这样),将行号分配给出价最低的联合产品,但没有出价

DROP TABLE IF EXISTS PRDUCTS,BIDS;

CREATE TABLE Prducts
( ProductID INT, Name  VARCHAR(20), Size VARCHAR(20), Weight VARCHAR(20), Color  VARCHAR(20));
INSERT INTO PRDUCTS VALUE
( 1              , 'Black Table' , '1m'   , '2kg'    , 'Black'  ), 
( 2              , 'Purple Table', '1m'   , '3kg'    , 'Purple' ), 
( 3              , 'Small Table' , '1m'   , '3kg'    , 'Black'  ), 
( 4              , 'Small Table' , '1m'   , '3kg'    , 'Black'  ), 
( 5              , 'Black Table' , '1m'   , '2kg'    , 'Black'  ), 
( 6              , 'Purple Table', '1m'   , '3kg'    , 'Purple' ),
( 7              , 'Small Table' , '1m'   , '3kg'    , 'Black'  ), 
( 8              , 'Small Table' , '1m'   , '3kg'    , 'Black'  ),
( 9              , 'BOMBASTO'    , '1m'   , '3kg'    , 'Black'  ); 

CREATE TABLE Bids
( BidID    INT     , ProductID  INT  , Status VARCHAR(20) ,     Price DECIMAL(10,2));
INSERT INTO BIDS VALUES
( 1              ,  1          , 'Active'      , 123.5   ),
( 2              ,  1          , 'Active'      , 325.99  ),
( 3              ,  1          , 'Active'      , 85.99   ),
( 4              ,  3          , 'Cancelled'   , 315.99  ),
( 5              ,  4          , 'Active'      , 113.5   ),
( 6              ,  3          , 'Cancelled'   , 305.99  ),
( 7              ,  1          , 'Active'      , 82.99   ),
( 8              ,  2          , 'Active'      , 345.99  );

WITH CTE AS
(SELECT P.PRODUCTID PPID,NAME,SIZE,WEIGHT,COLOR
       ,B.BIDID,B.PRODUCTID AS BPID,STATUS,PRICE
         ,ROW_NUMBER() OVER (PARTITION BY NAME,SIZE,WEIGHT,COLOR ORDER BY PRICE) RN
FROM PRDUCTS P
JOIN BIDS B ON B.PRODUCTID = P.PRODUCTID
) 
SELECT PPID,NAME,SIZE,WEIGHT,COLOR,PRICE FROM CTE 
WHERE  RN = 1
UNION ALL
SELECT DISTINCT PRODUCTID,NAME,SIZE,WEIGHT,COLOR,NULL
FROM   PRDUCTS P
WHERE  NOT EXISTS
        (SELECT 1 FROM CTE WHERE CTE.NAME = P.NAME      AND
                                         CTE.WEIGHT = P.WEIGHT  AND
                                         CTE.COLOR = P.COLOR);

+------+--------------+------+--------+--------+--------+
| PPID | NAME         | SIZE | WEIGHT | COLOR  | PRICE  |
+------+--------------+------+--------+--------+--------+
|    1 | Black Table  | 1m   | 2kg    | Black  |  82.99 |
|    2 | Purple Table | 1m   | 3kg    | Purple | 345.99 |
|    4 | Small Table  | 1m   | 3kg    | Black  | 113.50 |
|    9 | BOMBASTO     | 1m   | 3kg    | Black  |   NULL |
+------+--------------+------+--------+--------+--------+
4 rows in set (0.003 sec)

Mysql相关问答推荐

MySQL 8.0.28覆盖(和函数)索引未使用

MySQL嵌套的内连接使查询变得很慢-解决方案?

Python MySQL-无法从数据库中删除行

运行简单查询时Prisma预准备语句错误

如何计算具有权重属性的记录数

获取 TEXT 类型行的百分比

组平SQL查询结果

如何从将分钟、天、月和年存储在不同列中的表中查询数据

Laravel 查询构建器 where() 用于何时产品必须有多个标签(使用 product_tags 数据透视表多对多)

WHERE SQL 语句中的列顺序是否重要

如何通过未知列中的唯一值有效地更新 MySQL 行

SQL 中的双杠 (||) 是什么意思?

Laravel classloader.php 错误打开流失败:没有这样的文件或目录

将 mySQL 查询作为 cron 作业(job)运行?

MySQL 删除多列

MySQL中的行值增加和减少1

PHP mySQL - 将新记录插入表中,主键自动递增

MySQL连接查询使用like?

mysql GROUP_CONCAT 重复

Mysql 错误:try 转储表空间时,指定为定义者的用户 ('mysql.infoschema'@'localhost') 不存在'