MySQL 只显示特定字段的第一行
MySQL only show first row of specific field
以下查询:
SELECT *
FROM productlist.pricelist_merchant
WHERE product_id <> '0'
ORDER BY
product_id ASC,
qty = 0,
price ASC;
Returns:
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 的第一行让我感兴趣。有没有办法更改我的查询以实现此目的?我尝试了很多语句并且 none 有效...
提前致谢!
处理此查询的一种规范(和 ANSI 兼容)方法是将您的原始 table 连接到一个子查询,该子查询查找与每种产品的最低价格相对应的记录。然后,只需对原始 table 执行 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
这里的技巧是在按产品汇总时计算 两个 最低价格。第一个是非零数量记录的最低价格。该值将用于联接,除非不存在此类记录,在这种情况下,查询回退到零数量记录的最低价格。
输出:
此处演示:
可能无法显着加快 t1
(您的原始 table)和 t2
(派生的 table)之间的连接。但是,我们当然可以尝试加快找到每个产品最低价格的子查询。在 product_id
和 price
上添加复合索引:
CREATE INDEX idx ON pricelist_merchant (accountid, logindate);
现在子查询中的聚合应该执行得更快,因此整体查询可能会有所改善。
以下查询:
SELECT *
FROM productlist.pricelist_merchant
WHERE product_id <> '0'
ORDER BY
product_id ASC,
qty = 0,
price ASC;
Returns:
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 的第一行让我感兴趣。有没有办法更改我的查询以实现此目的?我尝试了很多语句并且 none 有效...
提前致谢!
处理此查询的一种规范(和 ANSI 兼容)方法是将您的原始 table 连接到一个子查询,该子查询查找与每种产品的最低价格相对应的记录。然后,只需对原始 table 执行 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
这里的技巧是在按产品汇总时计算 两个 最低价格。第一个是非零数量记录的最低价格。该值将用于联接,除非不存在此类记录,在这种情况下,查询回退到零数量记录的最低价格。
输出:
此处演示:
可能无法显着加快 t1
(您的原始 table)和 t2
(派生的 table)之间的连接。但是,我们当然可以尝试加快找到每个产品最低价格的子查询。在 product_id
和 price
上添加复合索引:
CREATE INDEX idx ON pricelist_merchant (accountid, logindate);
现在子查询中的聚合应该执行得更快,因此整体查询可能会有所改善。