2015-04-22 1 views
0

У меня возникают проблемы с оператором select SQL. Я признаю, что я новичок, поэтому заранее извиняюсь за любую неправильную терминологию.SQL: выберите элемент только один раз при фильтрации многими из многих

Так что я пытаюсь выбрать настроенные вызовы с заранее определенными тегами. Проблема, с которой я сталкиваюсь, заключается в том, что если вызов имеет несколько тегов, он вернет этот вызов для каждого тега, который отрицает всю суть того, что я пытаюсь сделать. Мне просто нужно руководствоваться тем, как использовать таблицу «многие из многих», и выбирать каждый элемент только один раз, а не для каждого тега.

Heres образец запроса, который отлично работает, кроме звонков.

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, но не дал никаких изменений в моих результатах. Я буду работать над этим, и если я найду решение своей проблемы, я поделюсь ею.

+1

Можете ли вы предоставить образцы данных и желаемые результаты? Учитывая, что вы группируете по идентификатору, вы не должны возвращать дубликаты в своем запрошенном запросе. – sgeddes

+0

У вас есть группа. Он не будет возвращать вызов несколько раз. –

+0

Он не будет возвращать номер телефона несколько раз, но это испортит счет. – hines

ответ

0

Вы должны уметь исправлять дублируемую проблему с помощью подзапроса. Рассматривая ваш запрос, кажется, что вам не нужны никакие данные из call_tag или тега, поэтому из этих таблиц следующий код просто возвращает отдельный список идентификаторов вызовов. Я несколько смущен насчет 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 уникальным идентификатором для каждой строки или напрямую связана с номером телефона? Я думаю, вам нужно будет выбрать только номер телефона, потому что идентификатор будет уникальным для каждого вызова, но я не знаю, как настроены данные.

Смежные вопросы