Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/72.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
Sql-使用最大值选择其他数据_Sql_Mysql - Fatal编程技术网

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:但说铅铸金很容易