MySQL只显示特定字段的第一行
以下查询:MySQL只显示特定字段的第一行,mysql,group-by,limit,greatest-n-per-group,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; 这对我来说太完美了。如果有可用数量,则产品标识按价格排序。但我只需要产品id的第一行。我希望有以下内容: Merchant|product_id|price |qty| Merch_A |3217
SELECT *
FROM productlist.pricelist_merchant
WHERE product_id <> '0'
ORDER BY
product_id ASC,
qty = 0,
price ASC;
这对我来说太完美了。如果有可用数量,则产品标识按价格排序。但我只需要产品id的第一行。我希望有以下内容:
Merchant|product_id|price |qty|
Merch_A |3217 |44.30 |16 |
Merch_L |3220 |105.84|1 |
我只对产品id的第一行感兴趣。是否有办法更改我的查询以实现此目的?我尝试了很多陈述,但都不起作用
提前谢谢 处理此查询的一种规范(且符合ANSI)方法是将原始表连接到一个子查询,该子查询查找与每个产品的最低价格相对应的记录。然后,只需在原始表上执行选择*
,即可获得这些匹配行的所有信息
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
现在,子查询中的聚合应该执行得更快,因此整个查询可能会得到改进。处理此查询的一种规范(且符合ANSI)方法是将原始表连接到一个子查询,该子查询将查找与每个产品的最低价格相对应的记录。然后,只需在原始表上执行选择*
,即可获得这些匹配行的所有信息
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
现在,子查询中的聚合应该执行得更快,因此整个查询可能会得到改进。将限制1添加到您的查询中query@AhmetKarabulut不,只有当OP只需要整个查询中的一条记录时,添加
限制1
才有效。如果需要来自多个组的单个记录,它将不起作用。groupby
没有作业。不能使用分组依据
选择行<代码>分组依据使用每组的数据计算新行。看一看a。将限制1添加到您的query@AhmetKarabulut不,只有当OP只需要整个查询中的一条记录时,添加限制1
才有效。如果需要来自多个组的单个记录,它将不起作用。groupby
没有作业。不能使用分组依据
选择行<代码>分组依据使用每组的数据计算新行。看一看a。谢谢你的回答!有没有办法加快查询速度?我发布的查询运行大约需要30秒。您的语句现在运行44分钟,这对我来说没有问题,因为我只需要每天运行一次。我一有结果就会回答你。@Vidarrus我想你可以添加一个复合索引来加速这个查询。我不知道它能快多少,但是试一下我的建议,让我们知道结果。我现在有了你查询的结果。该指数大大加速了这一进程。但是你的查询没有给我想要的结果,因为它没有检查产品的数量。在我的示例中,Merch_B将是产品3217的选定商户,但它应该是Merch_A,因为Merch_A的价格最便宜,数量>0。如果我在您的声明中添加“WHERE qty>'0'”,它会起作用,但有时有些产品没有商家提供任何数量,因此我希望选择价格最好的商家。@Vidarrus我更新了我的答案以处理此附加逻辑。现在的问题是索引可能不再加快查询速度。如果你真的需要一个闪电般的查询,你可能必须重新构造你的数据模型。在为我的新列建立索引后,我可以在一分钟内运行你的查询。结果就是我想要的,谢谢你的帮助!谢谢你的回答!有没有办法加快查询速度?我发布的查询运行大约需要30秒。您的语句现在运行44分钟,这对我来说没有问题,因为我只需要每天运行一次。我一有结果就会回答你。@Vidarrus我想你可以添加一个复合索引来加速这个查询。我不知道它能快多少,但是试一下我的建议,让我们知道结果。我现在有了你查询的结果。该指数大大加速了这一进程。但是你的查询没有给我想要的结果,因为它没有检查产品的数量。在我的示例中,Merch_B将是产品3217的选定商户,但它应该是Merch_A,因为Merch_A的价格最便宜,数量>0。如果我在您的声明中添加“WHERE qty>'0'”,它会起作用,但有时有些产品没有商家提供任何数量,因此我希望选择价格最好的商家。@Vidarrus我更新了我的答案以处理此附加逻辑。现在的问题是索引可能不再加快查询速度。如果你真的需要一个闪电般的查询,你可能必须重新构造你的数据模型。在为我的新列建立索引后,我可以在一分钟内运行你的查询。结果就是我想要的,谢谢你的帮助!
CREATE INDEX idx ON pricelist_merchant (accountid, logindate);