Sql-使用最大值选择其他数据
我非常怀疑如何检索表的最大值并在另一个查询中使用它 考虑这一点:Sql-使用最大值选择其他数据,sql,mysql,Sql,Mysql,我非常怀疑如何检索表的最大值并在另一个查询中使用它 考虑这一点: CREATE TABLE people ( peopleID int NOT NULL, cityID int NOT NULL ) 下面的请求提供了每个城市的人数 SELECT peopleID, COUNT(*) FROM people GROUP BY cityID 假设我想要最大城市的人口列表,我会这样写请求: SELECT people.peopleID, people.cityID FROM peo
CREATE TABLE people
(
peopleID int NOT NULL,
cityID int NOT NULL
)
下面的请求提供了每个城市的人数
SELECT peopleID, COUNT(*)
FROM people
GROUP BY cityID
假设我想要最大城市的人口列表,我会这样写请求:
SELECT people.peopleID, people.cityID
FROM people,
(
SELECT cityID, COUNT(*) AS "people_count"
FROM people
GROUP BY cityID
) g
WHERE people.cityID = g.cityID
HAVING people_count = MIN(people_count)
但这不起作用,实现这一要求的最佳方式是什么
谢谢:这种技术应该适用于大多数数据库:
SELECT peopleID
FROM people
WHERE cityID =
(
SELECT cityID
FROM people
GROUP BY cityID
ORDER BY COUNT(*) DESC
LIMIT 1
)
限制1不是标准SQL。标准规定您应仅使用FETCH FIRST 1行。有关如何仅获取各种数据库中的第一行的列表,请参见此处:
SELECT peopleID
FROM people
WHERE cityID =
(
SELECT cityID
FROM people
GROUP BY cityID
ORDER BY COUNT(*) DESC
LIMIT 1
)
编辑:我误解了你的问题。我认为您的意思是执行此查询的合理方式,它可以轻松地修改以在几乎任何SQL数据库中工作。但事实证明,您真正想知道的是如何编写查询,以便在所有数据库中使用完全相同的语法。即使是无人使用的随机数据库也不支持SQL标准。在这种情况下,您可以尝试此方法,但我相信您可以找到一个即使这样也不起作用的数据库:
SELECT peopleID, cityID
FROM people
WHERE cityID = (
SELECT MAX(cityID)
FROM (
SELECT cityID
FROM people
GROUP BY cityID
HAVING COUNT(*) =
(
SELECT MAX(cnt) FROM
(
SELECT cityID, COUNT(*) AS cnt
FROM people
GROUP BY cityID
) T1
)
) T2
)
此技术应适用于大多数数据库:
SELECT peopleID
FROM people
WHERE cityID =
(
SELECT cityID
FROM people
GROUP BY cityID
ORDER BY COUNT(*) DESC
LIMIT 1
)
限制1不是标准SQL。标准规定您应仅使用FETCH FIRST 1行。有关如何仅获取各种数据库中的第一行的列表,请参见此处:
SELECT peopleID
FROM people
WHERE cityID =
(
SELECT cityID
FROM people
GROUP BY cityID
ORDER BY COUNT(*) DESC
LIMIT 1
)
编辑:我误解了你的问题。我认为您的意思是执行此查询的合理方式,它可以轻松地修改以在几乎任何SQL数据库中工作。但事实证明,您真正想知道的是如何编写查询,以便在所有数据库中使用完全相同的语法。即使是无人使用的随机数据库也不支持SQL标准。在这种情况下,您可以尝试此方法,但我相信您可以找到一个即使这样也不起作用的数据库:
SELECT peopleID, cityID
FROM people
WHERE cityID = (
SELECT MAX(cityID)
FROM (
SELECT cityID
FROM people
GROUP BY cityID
HAVING COUNT(*) =
(
SELECT MAX(cnt) FROM
(
SELECT cityID, COUNT(*) AS cnt
FROM people
GROUP BY cityID
) T1
)
) T2
)
我想要一个独立于数据库的解决方案,只有纯SQL编程:数据这里没有纯SQL这样的东西-ANSI不能在任何数据库上全部实现。@OMG Ponies-从技术上讲,可以说纯SQL仅限于ISO规范中支持的语句。然而,这只适用于学术练习。它在一个或多个数据库产品中不起作用的可能性很高,考虑到这一点,这取决于您想要的是可以在实际产品中使用的东西,还是可以用来赢得对Celko的争论的东西。只需编写所有示例,将其用作您的参考SQL数据库。将他们对数据库的知识从SqLite转换到他们需要使用的任何东西都应该是非常容易的,这有一个优点,任何试图学习的人都可以在家里或课堂上使用它,而无需安装工作或成本。当然,你可以指出一些特别的地方,这些地方的差异是显著的。请注意,某些数据库上有一些重要的特定于数据库的功能,使用它们的人应该了解这些功能。我想要一个独立于数据库的解决方案,只有纯SQL编程:数据没有纯SQL的东西,ANSI不能在任何数据库上完全实现。@OMG Ponies-嗯,从技术上讲,可以说,纯SQL仅限于一个ISO规范中支持的语句。然而,这只适用于学术练习。它在一个或多个数据库产品中不起作用的可能性很高,考虑到这一点,这取决于您想要的是可以在实际产品中使用的东西,还是可以用来赢得对Celko的争论的东西。只需编写所有示例,将其用作您的参考SQL数据库。将他们对数据库的知识从SqLite转换到他们需要使用的任何东西都应该是非常容易的,这有一个优点,任何试图学习的人都可以在家里或课堂上使用它,而无需安装工作或成本。当然,你可以指出一些特别的地方,这些地方的差异是显著的。请注意,在某些数据库上有一些重要的特定于数据库的功能,使用这些功能的人应该了解这些功能。在Sybase上,没有限制或限制!所以不适用于所有数据库:/这只适用于MySQL..OP要求在comments@ArnaudF:并不是所有数据库都支持标准SQL,所以恐怕这是不可能的。@Arnaud F-仅仅因为问题很容易陈述并不意味着它很容易解决。事实上,我发现事实恰恰相反。我只想要这座桥从这里到这里。在地图上只有三英寸。它应该很简单。只要在纽约和伦敦之间建一座桥。@Thomas:但说铅铸金很容易在Sybase上,没有限制或顶部!所以不适用于所有数据库:/这只适用于MySQL..OP要求在comments@ArnaudF:并不是所有数据库都支持标准SQL,所以恐怕这是不可能的。@Arnaud F-仅仅因为问题很容易陈述并不意味着它很容易解决。事实上,我
找到相反的答案通常是正确的。我只想要这座桥从这里到这里。在地图上只有三英寸。它应该很简单。只要在纽约和伦敦之间建一座桥。@Thomas:但说铅铸金很容易