www.sql-ex.ru#14

时间:2016-01-24 19:36:15

标签: sql

我正在尝试从众所周知的(我相信)网站www.sql-ex.ru解决问题14,因为我需要学习sql(我对这门语言很新) 这是在stackoverflow Problem 14 question StackOverflow.上回答的相同问题 我的第一种方法是:

var c_id = "YOUR_ID_HERE";
var c_secret = "YOUR_SECRET_HERE";
var access_code = "YOUR_AUTH_HTTP_CODE_HERE";
var params = "client_id=" + c_id + "&client_secret=" + c_secret + "&code=" + access_code;

xmlhttp = new XMLHttpRequest();
xmlhttp.onreadystatechange = function () {
  if (xmlhttp.readyState == 4 && xmlhttp.status == 200) {
    alert(xmlhttp.responseText);
  }
}

xmlhttp.open("POST", "https://www.strava.com/oauth/token", true);
xmlhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
xmlhttp.setRequestHeader("Content-length", params.length);
xmlhttp.setRequestHeader("Connection", "close");
xmlhttp.send(params);

显然这是错的,但我不明白为什么, 我一直在四处寻找,我在google上发现了这个:

select maker, type
from product
group by maker, type
having count(type)=1 and count(model)>1

也许我已经开始了,但我不明白MAX对char值做了什么以及为什么现在一切正常。

有人可以对这个问题有所了解吗?

欢呼声,

1 个答案:

答案 0 :(得分:0)

字符有"整理顺序"那个(和其他东西)给出了">",ORDER BY和MAX / MIN的排序。

在大多数SQL中,当您使用GROUP BY(或使用没有它的HAVING,隐式地GROUPs BY所有列)时,您只能选择GROUP BY中的列或者作为聚合的参数出现的列。这是因为每个组可能有多个行具有多个值,因此列名称并不代表特定值。虽然在标准SQL和某些产品中,当DBMS被告知每个分组列的子列只有该列的一个值时,您也可以使用一列。

您展示的涉嫌链接的查询不是链接答案中的内容。这不是问题的正确答案。它返回你的所作所为。

select maker, MAX(type)
from product
group by maker, type
having count(type)=1 and count(model)>1

在解决方案中,MAX可以被删除,因为type是分组列。但这不是一个解决方案,因为无论出现什么类型,每个制造商类型都有一个组,因此每组一个类型。它不会将输出限制为只有一种类型的制造商。

链接上的实际代码是:(请注意您的副本丢失的distinct。)

select maker, max(type)
from product
group by maker, type
having count(distinct type)=1 and count(model)>1

这为每个制造商类型对创建了一个组。因此,组的一种类型值的MAX自然是该组的类型值。每组只有一个不同的值。所以它也会回报你的所作所为。

这不是他们想要的。他们想写的是:

select maker, max(type)
from product
group by maker
having count(distinct type)=1 and count(model)>1

这仅选择给定制造商的可能很多行中具有一个 distinct 类型值的组。可以在SELECT中提及类型,因为它在聚合MAX中。 MAX类型将是所有具有相同(不同)值的行中的最大值。

但现在不能删除MAX,因为type不是分组列。

PS如果表是空的怎么办?