【发布时间】: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