mysql - 在采用 where 条件之前应用聚合函数

标签 mysql

我有两个表,TABLE_A 和 TABLE_B。这就是我想要做的:获取 TABLE_A 中所有唯一出现的 FIELD_2,以及每个出现次数最多的 FIELD_1。然后,仅选择我在那里的FIELD_1,其中TABLE_B中相应的FIELD_3不是“OK”。 (FIELD_1 存在于 TABLE_A 和 TABLE_B 中。)

首先,我从一种简单的方法开始,如上所述,我分三步完成了此操作。 (要了解我做了什么,最简单的方法是从第 1 步开始,然后向外进行,这就是我编写代码的方式):

/* START Step 3 – Take only those of the highest FIELD_1 from TABLE_A, where the corresponding FIELD_3 in TABLE_B is not ‘OK’ */
SELECT DISTINCT
    FIELD_1
FROM
    TABLE_B
WHERE
    FIELD_1 IN 
    (
    /* START Step 2 – Take only the highest FIELD_1 from Step 1 */
    SELECT
        MAXFIELD_1
    FROM
        (
        /* START Step 1 – Take the highest FIELD_1 for all of the FIELD_2 which are in TABLE_A */
        SELECT
            FIELD_2, 
            MAX(FIELD_1) MAXFIELD_1
        FROM
            TABLE_A 
        GROUP BY
            FIELD_2
        /* END Step 1 */
        )
    /* END Step 2 */
    )
AND
    FIELD_3 <> 'OK'
/* END Step 3 */

但是,当我继续做我想做的事情时,这变得越来越丑陋,我正在寻找一种通过使用 JOIN 语句来缩短它的方法。起初我尝试过这个:

SELECT
    A.FIELD_2, 
    MAX(A.FIELD_1) FIELD_1 
FROM
    TABLE_A A
    INNER JOIN TABLE_B B ON A.FIELD_1 = B.FIELD_1
WHERE 
    B.FIELD_3 <> 'OK'
GROUP BY
    A.FIELD_2

不幸的是,现在似乎发生的是 MAX(A.FIELD_1) 返回 TABLE_A 中最高的 FIELD_1,其中对应的 FIELD_3 <>“OK”。换句话说,首先应用 where 语句,然后选择最高的 FIELD_1。我需要首先选择 A.FIELD_2 和 MAX(A.FIELD_1),之后,仅选择 B.FIELD_3 <>“确定”的情况。

我该怎么做?

最佳答案

我不明白您在哪里应用了第一个要求:

Take all unique occurrences of FIELD_2 in TABLE_A

我期待看到 DISTINCT您的查询中的关键字。

尽管如此,如果你想过滤 B.FIELD_3 <> 'OK'获取字段后 A.FIELD_2MAX(A.FIELD_1) ,您可以使用HAVING条款。

SELECT
    A.FIELD_2, 
    MAX(A.FIELD_1) FIELD_1,
    B.FIELD_3,
FROM
    TABLE_A A
    INNER JOIN TABLE_B B ON A.FIELD_1 = B.FIELD_1
GROUP BY
    A.FIELD_2
HAVING
    FIELD_3 <> 'OK'

关于mysql - 在采用 where 条件之前应用聚合函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38433301/

相关文章:

java - 使用在 JTable 上的 JTextfield 中键入的名字或姓氏搜索 MYSQL 数据库过滤

php - 全文搜索不返回总数

php - 使用 cakephp 和 HABTM 将关联数据保存到数据库中

javascript - 如何使用 PHP 中的 ID 数组从 mysql 表中删除多行

jquery - 无法使用ajax检索大量数据

mysql - 使用 MySQL 获取时间戳

mysql - 将重复的匹配对分组到一个组中 - SQL

php - 我想检查用户名在注册页面是否可用

mysql - 多个字段有相同的columnName Android Room

将消息分组为对话的 MySQL 查询