Sql - 使用最大值来选择其他数据

标签 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 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
)

LIMIT 1 不是标准 SQL(标准声明您应该仅使用 FETCH FIRST 1 ROWS)。有关如何仅获取各种数据库中的第一行的列表,请参见此处:


编辑:我误解了你的问题。我认为您的意思是什么是执行此查询的明智方法,可以轻松修改以在几乎任何 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 - 使用最大值来选择其他数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4838487/

相关文章:

mysql - 从 SQL Server 迁移到 AWS Aurora

PHP/MySQL 从数据库中取出一个表,但从表中排除一个字段?

java - Hibernate 1 到 M 对 child 的限制

sql - 报错: SQL Error: A foreign key value has no matching primary key value. 百思不得其解

sql - 插入创建新表

mysql - 从多个值计算最大的单个间隙

c# - "No database selected"异常

mysql - 全文搜索 PHP

mysql - 内连接嵌套在更新语句 SQL 中

php - PDO::query 与 PDOStatement::execute(PHP 和 MySQL)