2015-04-22 95 views
0

我遇到了SQL select语句的问题。我承认我是新手,所以我提前为任何不正确的术语道歉。SQL:只有一次筛选项目时被多对多筛选

所以我试图选择一个具有预定标记的调用。我面临的问题是,如果一个调用有多个标签,它将返回每个标签的调用,这会否定我正在尝试执行的所有操作。我只需要指导如何在桌子上使用多对多,并且只选择一个项目而不是每个标签。

继承人一个简单的示例查询,除了双向上调用以外的工作很棒。

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` 

我试过使用独特的命令,但它没有改变我的结果。我将在此期间进行研究,如果我找到解决方案,我会分享它。

+1

你能提供样品数据和想要的结果吗?考虑到你是由id分组的,你不应该在你发布的查询中返回重复。 – sgeddes

+0

你有一个'group by'。它不会多次拨打电话。 –

+0

它不会多次返回一个电话号码,但会占用计数。 – hines

回答

0

你应该能够修复子查询的重复问题。看看你的查询,看起来你不需要来自call_tag或标签的任何数据,所以从这些表中下面的代码只是返回一个明确的call 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还是与电话号码直接相关?我想你只想选择电话号码,因为每个电话号码都是唯一的,但我不知道数据是如何设置的。