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);