Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql SQL-Min函数_Mysql_Sql_Oracle - Fatal编程技术网

Mysql SQL-Min函数

Mysql SQL-Min函数,mysql,sql,oracle,Mysql,Sql,Oracle,我的问题是编写一个SQL查询,确定哪一个场地最便宜,可以容纳120人 我写的代码 select v.venuename, min(v.costperday) from venues v where v.venuecapacity = 120 Group By v.venuename; 我仍然得到了两个答案,一个也没有得到 但是如果我从select函数中删除V.venueName…我会得到正确的答案 为什么会这样 非常感谢你的帮助。 感谢您在选择列表中包含相同的字段,因此将为每个字段计算最小

我的问题是编写一个SQL查询,确定哪一个场地最便宜,可以容纳120人

我写的代码

select v.venuename, min(v.costperday)
from venues v 
where v.venuecapacity = 120
Group By v.venuename; 
我仍然得到了两个答案,一个也没有得到

但是如果我从select函数中删除V.venueName…我会得到正确的答案

为什么会这样

非常感谢你的帮助。
感谢您在选择列表中包含相同的字段,因此将为每个字段计算最小值,而不是为所有项目计算最小值

SELECT *
FROM (
    SELECT venuename, 
           costperday,
           min(costperday) over () as min_cost,
    FROM venues
    WHERE venuecapacity = 120
) v
WHERE v.min_cost = v.costperday
或使用子选择:

SELECT *
FROM venues
WHERE venuecapacity = 120
AND costperday = (SELECT min(v2.costperday) 
                  FROM venues v2
                  WHERE v2.venuecapacity = 120)

如果有些场馆可容纳120人以上,但仍然比只允许120人的场馆便宜,那么您可能希望使用venuecapacity
=120
,这是因为如果您包括名称,您选择了每个场馆每天的最低成本。事实上,只要VenuName是唯一的,整个分组在这个表中是无用的

select v.venuename, min(v.costperday)
from 
(
  select venuename, costperday
  from venues
  where v.venuecapacity = 120) v
要获得价格最低的场地,请使用以下内容:

select venuename, costperday
from
  venues v
where
  v.venuecapacity = 120 and
  v.costperday = (select min(costperday) from venue vs where va.venuecapacity = 120)

我想这可能是你想要的:

SELECT venuename
  FROM (SELECT venuename, costperday, MIN(costperday) OVER () mincost
          FROM venues
         WHERE venuecapacity >= 120) q
 WHERE q.costperday = q.mincost;
使用>=120,因为您可能没有任何场馆正好有120个容量,并且您希望所有场馆至少能处理120个容量。您的要求仅说明场馆能容纳120人,而不是说它能容纳120人。

使用CTE可以做到这一点

WITH minquery AS
 (SELECT min(costperday) AS mincost
  FROM venues
  WHERE venuecapacity>=120)
SELECT venuename, venuecapacity, costperday
  FROM venues 
  WHERE costperday=minquery.mincost AND venuecapacity>=120;
我的问题是编写一个SQL查询 将确定哪一个最小 昂贵的场地,可容纳 120人

在SQL Server中,我将使用
选择Top1。。。订购人

select top 1 v.venuename, v.costperday
from venues v 
where v.venuecapacity = 120
order by v.costperday 
我有点目不转睛地发现MySQL和Oracle的这种语法似乎可以工作,但我没有测试过

MySQL

神谕

select v.venuename, v.costperday
from (select v.venuename, v.costperday
      from venues v 
      where v.venuecapacity = 120
      order by v.costperday
     )
where rownum = 1
@拉胡尔·巴蒂亚

我们还可以使用另外一种解决方案

select v.venuename, 
       min(v.costperday) 
 from venues v  
 where v.venuecapacity >= 120 
 Group By v.venuename
 having min(v.costperday) = (
       select min(costperday)
       from venues 
       where venuecapacity >= 120 );  

选择多个字段不可能更改结果集。我没有。不知道为什么。你的回答有道理。我回答了:)因为
select
列表中的值与返回的行数无关。一切都取决于
group by
值。
您在选择列表中包括相同的字段
,我指的是group by子句中的字段。我想准确地回答这个问题(为什么他会得到那个结果),但解决办法是别的,他应该从group by中删除该字段以获得结果。如果选择列表中没有包含相同的字段,则仍然会为每个分组的
VenuName
计算最小值,如果该值在
group by
子句中。
select v.venuename, 
       min(v.costperday) 
 from venues v  
 where v.venuecapacity >= 120 
 Group By v.venuename
 having min(v.costperday) = (
       select min(costperday)
       from venues 
       where venuecapacity >= 120 );