SQL: select item only only once by many to many filtering by 多对多过滤

SQL: select item only once when filtering by many to many

我对 SQL select 语句有疑问。我承认我是新手,所以我提前为任何不正确的术语道歉。

所以我正在尝试 select 设置具有预定标签的调用。我面临的问题是,如果一个调用有多个标签,它将 return 调用每个标签,这否定了我正在尝试做的事情的全部意义。我只需要一些指导,了解如何通过 table 和 select 每个项目仅使用一次而不是每个标签使用多对多。

这是一个示例查询,除了双倍调用之外效果很好。

SELECT `call`.`id`, `call`.`phone_number`,  COUNT(`call`.`phone_number`) 
FROM `call`
INNER JOIN `call_tag` on `call_tag`.`call_id` = `call`.`call_id`
INNER JOIN `tag` on `tag`.`id` = `call_tag`.`tag_id`
WHERE `tag`.`id` IN (1,2,3)
AND `call`.`phone_number` IN ('4445556666', '6665554444', '8889997777')
AND `call_date` BETWEEN '2015-01-01 07:00:00+00:00' and '2015-03-20 05:59:59+00:00'
GROUP BY `call`.`id`

我试过使用 Distinctive 命令,但结果没有任何变化。我会同时处理这个问题,如果我找到解决问题的方法,我会分享它。

您应该能够使用子查询解决重复问题。查看您的查询,您似乎不需要来自 call_tag 的任何数据或标记,因此从这些表中,以下代码只是 returns 一个不同的呼叫 ID 列表。我对 call.id 和 call.call_id 感到有些困惑,它们应该是不同的列吗?我还将 call.phone_number 添加到组中,因为没有它应该会出错。

SELECT `call`.`id`, `call`.`phone_number`,  COUNT(`call`.`phone_number`) 
FROM `call` 
INNER JOIN (SELECT DISTINCT call_tag.call_id 
                FROM `call_tag` 
                INNER JOIN `tag` 
                    on `tag`.`id` = `call_tag`.`tag_id` 
                WHERE `tag`.`id` IN (1,2,3) 
            ) t
    on t.call_id = `call`.`call_id` 
WHERE `call`.`phone_number` IN ('4445556666', '6665554444', '8889997777') 
AND `call_date` BETWEEN '2015-01-01 07:00:00+00:00' and '2015-03-20 05:59:59+00:00' 
GROUP BY `call`.`id`, 'call'.'phone_number'

对于计数,call.id 是每一行的唯一 ID 还是直接与 phone 数字相关?我认为您只想 select phone 号码,因为每次调用的 ID 都是唯一的,但我不知道数据是如何设置的。