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

Arn*_* F. 0 mysql sql

我对检索表的最大值并在另一个查询中使用它的方式有很大疑问.

考虑一下:

CREATE TABLE people
(
    peopleID int NOT NULL,
    cityID int NOT NULL
)
Run Code Online (Sandbox Code Playgroud)

以下请求为我提供了每个城市的人数

SELECT peopleID, COUNT(*)
FROM people
GROUP BY cityID
Run Code Online (Sandbox Code Playgroud)

假设我想要最大城市的人员列表,我会写这样的请求:

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)
Run Code Online (Sandbox Code Playgroud)

但是不起作用,达到这个要求的最佳方法是什么?

谢谢 :)

Mar*_*ers 5

这种技术应该适用于大多数数据库:

SELECT peopleID
FROM people
WHERE cityID =
(
    SELECT cityID
    FROM people
    GROUP BY cityID
    ORDER BY COUNT(*) DESC
    LIMIT 1
)
Run Code Online (Sandbox Code Playgroud)

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
)
Run Code Online (Sandbox Code Playgroud)

  • @Arnaud F - 仅仅因为问题易于陈述并不意味着它很容易解决.事实上,我发现相反的情况通常是正确的."我只想把这座桥从这里带到这里.在地图上,它只有三英寸.它应该很简单.只需建一座从纽约到伦敦的桥梁." (4认同)