MySQL只显示特定字段的第一行

标签 mysql group-by limit greatest-n-per-group

以下查询:

SELECT *
    FROM productlist.pricelist_merchant
    WHERE product_id <> '0'
ORDER BY 
    product_id ASC, 
    qty = 0, 
    price ASC;

返回:

Merchant|product_id|price |qty|
Merch_A |3217      |44.30 |16 |
Merch_Z |3217      |45.14 |2  |
Merch_U |3217      |45.62 |16 |
Merch_I |3217      |46.06 |16 |
Merch_Q |3217      |48.98 |55 |
Merch_B |3217      |39.58 |0  |
Merch_T |3217      |45.97 |0  |
Merch_M |3217      |46.40 |0  |
Merch_L |3220      |105.84|1  |
Merch_Z |3220      |147.00|3  |
Merch_U |3220      |149.36|2  |
Merch_A |3220      |149.99|2  |
Merch_Q |3220      |153.53|90 |
Merch_I |3220      |154.51|2  |
Merch_T |3220      |157.41|4  |
Merch_C |3220      |164.59|46 |
Merch_M |3220      |136.10|0  |
Merch_B |3220      |136.71|0  |

这对我来说是完美的。如果有可用数量,则product_id 按价格排序。但我只需要product_id 的第一行。我想要这个:

Merchant|product_id|price |qty|
Merch_A |3217      |44.30 |16 |
Merch_L |3220      |105.84|1  |

只有product_id 的第一行让我感兴趣。有没有办法改变我的查询来实现这一目标?我尝试了很多语句,但没有一个起作用......

提前致谢!

最佳答案

处理此查询的一种规范(且符合 ANSI 标准)方法是将原始表连接到子查询,该子查询查找与每种产品的最低价格相对应的记录。然后,只需在原始表上执行 SELECT * 即可获取这些匹配行的所有信息。

SELECT t1.*
FROM pricelist_merchant t1
INNER JOIN
(
    SELECT
        product_id,
        MIN(CASE WHEN qty > 0 THEN price END) AS min_price_qty,
        MIN(CASE WHEN qty = 0 THEN price END) AS min_price_no_qty
    FROM pricelist_merchant
    WHERE product_id <> '0'
    GROUP BY product_id
) t2
    ON t1.product_id = t2.product_id AND
       t1.price      = COALESCE(t2.min_price_qty, t2.min_price_no_qty)
ORDER BY t1.product_id

这里的技巧是在按产品聚合时计算两个最低价格。第一个是数量非零的记录的最低价格。该值将在联接中使用,除非不存在此类记录,在这种情况下,查询将回退到零数量记录的最低价格。

输出:

enter image description here

此处演示:

Rextester

可能无法显着加快 t1(原始表)和 t2(派生表)之间的联接速度。但是,我们当然可以尝试加快查找每种产品最低价格的子查询。在 product_idprice 上添加复合索引:

CREATE INDEX idx ON pricelist_merchant (accountid, logindate);

现在子查询中的聚合应该执行得更快,因此整体查询可能会得到改善。

关于MySQL只显示特定字段的第一行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46056647/

相关文章:

SQL 一对多 JOIN 没有子查询?

mysql - Loopback应用程序连接到mysql谷歌云

mysql - 在 bash 中从 mysql 获取计数值的最简单方法

php - 构建 MySQL 表,其中 PLAYLIST 表引用多个 VIDEO id 整数和 USER 表 id

mysql - 简单的MySQL更新功能

mysql - 使用 MySQL 的时间间隔 SQL 查询

sql - 这是为此报告编写 SQL 的最佳方式吗?

sql - 基于 GROUP BY 结果的多重自连接

MYSQL SELECT 与矛盾的限制

Python if 语句 : less than