【问题标题】:How to select one row if two have the same ID and data except one column如果两个除了一列之外具有相同的ID和数据,如何选择一行
【发布时间】:2021-04-10 11:42:51
【问题描述】:

我的问题对我来说似乎很复杂,我几乎解决了。为了简单起见,我有一组来自递归 SELECT 的行,我将在主要目标之后解释,以防有人有简单的解决方案。

首先,这是我的(简化的)数据:

id account_managers lead_am_id
1 2, 141 2
1 2, 141 NULL
2 16 NULL
3 6, 12 NULL
4 6, 11 NULL

我不想要第二行。我只想通过“id”保留一行,如果有重复保留具有“lead_am_id”值的行。所以我的尝试是(简化查询):

SELECT contract_with_lead_am.*, MAX(contract_with_lead_am.lead_am) AS lead_am_id
FROM contract_with_lead_am
GROUP BY contract_with_lead_am.id;

这在我的开发环境中有效,但在生产中失败并出现以下错误:

错误:ER_WRONG_FIELD_WITH_GROUP:SELECT 列表的表达式 #17 不在 GROUP BY 子句中,并且包含在功能上不依赖于 GROUP BY 子句中的列的非聚合列“contract_with_lead_am.lead_am”;这与 sql_mode=only_full_group_by">

不兼容

如果有人知道如何解决这个问题,我将不胜感激。

现在详细的问题,这里是完整的查询:

SELECT contract_with_lead_am.*, MAX(contract_with_lead_am.lead_am) AS lead_am_id
FROM (SELECT distinct contracts_with_am.*, IF(contracts_users.is_lead=1, contracts_users.users_id, NULL) AS lead_am
        FROM (SELECT contracts.*, group_concat(contracts_users.users_id SEPARATOR ", ") AS account_managers
                FROM contracts LEFT JOIN contracts_users ON contracts.id = contracts_users.contracts_id 
                WHERE contracts_users.type = 1
                GROUP BY contracts.id
                ORDER BY contracts.id DESC) contracts_with_am 
LEFT JOIN contracts_users ON contracts_with_am.id = contracts_users.contracts_id) contract_with_lead_am
GROUP BY contract_with_lead_am.id;

这需要一点解释。我有一个“合同”表,其中包含我的所有合同,其中包含一个“id”PK 和一个“contracts_users”表,它在“用户”和“合同”之间建立关系,定义谁是商业的(contracts_users.type=0)和谁是客户经理 (contracts_users.type=1)。

由于某些服务器原因,我需要在同一行获取所有客户经理的 ID。所以我使用带有 ', ' 分隔符的 group_concat() 函数可以在我的服务器上使用。在“contracts_users”表中还有一个 Lead Account_manager。我的想法是从我的行中测试 IF() 我的客户经理是潜在客户(contracts_users.is_lead=1),我将contracts_users.users_id(客户经理 ID)放在“lead_am”列中。在此之后,我仍然遇到上面解释的重复问题,所以我想再次使用 GROUP BY 和 MAX()。它在开发中有效,但在生产中失败。

这是我使用的(再次简化的)表格:

合同

field name type
id INT (PK)
some_data VARCHAR

用户

field name type
id INT (PK)
some_data VARCHAR

contracts_users

field name type
users_id INT (PK, FK)
contracts_id INT (PK, FK)
type INT
is_lead INT

【问题讨论】:

    标签: mysql duplicates


    【解决方案1】:

    只是为了让大家知道,我通过下面的查询找到了一种方法:

    SELECT contract_with_lead_am.*
    FROM (SELECT distinct contracts_with_am.*, ANY_VALUE(IF(contracts_users.is_lead=1, contracts_users.users_id, NULL)) AS lead_am
        FROM (SELECT contracts.*, ANY_VALUE(group_concat(contracts_users.users_id SEPARATOR ", ")) AS account_managers
            FROM contracts LEFT JOIN contracts_users ON contracts.id = contracts_users.contracts_id 
            WHERE contracts_users.type = 1
            GROUP BY contracts.id) contracts_with_am 
    LEFT JOIN contracts_users ON contracts_with_am.id = contracts_users.contracts_id) contract_with_lead_am
    GROUP BY contract_with_lead_am.id
    UNION
    SELECT contracts.*, ANY_VALUE(NULL) AS account_managers, ANY_VALUE(NULL) AS lead_am
    FROM contracts RIGHT JOIN contracts_users ON contracts.id = contracts_users.contracts_id
    GROUP BY contracts.id
    HAVING COUNT(*) < 2
    ORDER BY id DESC;
    

    我对需要的数据进行了两次查询并使用了 UNION。我还添加了 ANY_VALUE() 以绕过错误“ER_WRONG_FIELD_WITH_GROUP”。

    【讨论】:

      猜你喜欢
      • 2020-11-04
      • 1970-01-01
      • 2019-11-18
      • 2018-08-17
      • 1970-01-01
      • 2017-12-31
      • 1970-01-01
      • 1970-01-01
      • 2012-03-03
      相关资源
      最近更新 更多