【问题标题】:How to retrieve minimum value(s) from a set of values returned by Sub-query如何从子查询返回的一组值中检索最小值
【发布时间】:2017-08-11 07:18:48
【问题描述】:

以下子查询:

SELECT R.mID AS MID, AVG(R.stars) AS AVGSTARS FROM Rating R
GROUP BY R.mID
ORDER BY AVGRSTARS

返回以下值:

MID   AVGSTARS

104    2.5000
103    2.5000
101    3.0000
108    3.3333
107    4.0000
106    4.5000

现在我必须从这个恰好是的中间结果中检索最小值

MID   AVGSTARS

104    2.5000
103    2.5000

为了实现这一点,我编写了以下不起作用的查询:

SELECT INTER1.RMID FROM
(SELECT R.mID AS MID, AVG(R.stars) AS AVGSTARS FROM Rating R
GROUP BY R.mID
ORDER BY AVGRSTARS) INTER1
WHERE MIN(AVGRSTARS) = INTER1.AVRSTARS

我知道它不起作用,但我想在这些行上写一个查询。谁能帮帮我。

谢谢。

【问题讨论】:

  • 请提供类似minimal reproducible example 的内容。例如。 SQLite 命令行工具中的.dump 用于适当定制的玩具数据库。并展示一些所需输出的示例。

标签: sqlite subquery min


【解决方案1】:

你可以使用:

WITH cte AS ( 
  SELECT R.mID AS MID, AVG(R.stars) AS AVGSTARS 
  FROM Rating R GROUP BY R.mID ) 
SELECT MID, AVGSTARS 
FROM cte 
WHERE AVGSTARS = (SELECT MIN(AVGSTARS) FROM cte);

DBFiddle Demo

编辑:

8.0 之前的 MySQL:

SELECT MID, AVGSTARS 
FROM (SELECT R.mID AS MID, AVG(R.stars) AS AVGSTARS 
      FROM Rating R GROUP BY R.mID ) sub
WHERE AVGSTARS = (SELECT MIN(AVGSTARS) 
                  FROM (SELECT R.mID AS MID, AVG(R.stars) AS AVGSTARS 
                        FROM Rating R GROUP BY R.mID) AS s)

【讨论】:

  • 什么是等效的 MySQL 兼容查询?
  • @dsfasdfadf 所以它不是原始问题中发布的 SQLite? MariaDB/MySQL 8.0 应该可以正常工作。
  • 我在 MySQL 和 SQLite 中练习查询。在 SQLite 中它工作得很好,但问题出现在 MySQL 中,因为我使用的版本是 v6.3
  • @dsfasdfadf 检查没有 cte 的版本
  • @dsfasdfadf 冗余使用CTE 解决。不幸的是,旧的 MySQL 版本不支持它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-09-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-01
  • 2019-09-11
  • 1970-01-01
相关资源
最近更新 更多