2016-11-02 2 views
3

Я MYSQL для начинающих и у меня есть проблемы с запросом:MYSQL (SELECT при определенных условиях)

У меня есть две таблицы (звонки, callsfailed).

  1. называет эти столбцы (called_number, продолжительность).
  2. callsfailed эти столбцы (called_number, release_reason)

Позволяет Say вызовы Таблица является:

+---------------+----------+ 
| called_number | duration | 
+---------------+----------+ 
| 1010101  | 13  | 
| 1010101  | 18  | 
| 1010101  | 20  | 
| 2020202  | 50  | 
| 2020202  | 20  | 
| 3030303  | 10  | 
| 4040404  | 30  | 
+---------------+----------+ 

И callsfailed Таблица является:

+---------------+----------------+ 
| called_number | release_reason | 
+---------------+----------------+ 
| 1010101  | -1    | 
| 1010101  | -1    | 
| 2020202  | -1    | 
| 3030303  | 406   | 
| 4040404  | 503   | 
| 5050505  | -1    | 
| 5050505  | -1    | 
| 6060606  | -1    | 
+---------------+----------------+ 

I хотеть для выбора вызываемого_собрания> 1, когда он делает продолжительность менее 25, ИЛИ он делает release_размер = -1. более 1 раза.

НО Если caller_number сделал срок более 25 лет, не выбрать его, даже если он имеет release_reason = -1.

Так что результат будет:

+---------------+-------+ 
| called_number | count | 
+---------------+-------+ 
| 1010101  | 3  | 
| 5050505  | 2  | 
+---------------+-------+ 

Мой код:

( SELECT called_number, duration, COUNT(*) count 
    FROM calls 
    GROUP BY called_number 
    Having COUNT(called_number) > 1 and duration < 25 
) 

UNION 

(SELECT called_number, release_reason, COUNT(*) count 
    FROM callsfailed 
    GROUP BY called_number 
    Having COUNT(called_number) > 1 and release_reason = -1 
) 
+2

Там немного о проблеме с вашими таблицами: есть ли связь между вхождениями один стол, другой? Например, что, если число имеет как '-1', так и что-то еще (например,' 406') как 'release_reason', каков должен быть результат? – Terry

+0

Было бы сосредоточено на '-1' и просто игнорировать' 406' или по любой другой причине –

ответ

1

Вы можете использовать UNION в качестве производной таблицы и выберите на нем, как этот

SELECT t1.called_number, t1.count_calls FROM 
(
    SELECT called_number, MAX(duration) max_duration, COUNT(called_number) count_calls 
    FROM calls 
    GROUP BY called_number 
    HAVING COUNT(called_number) > 1 AND max_duration < 25  

    UNION  

    SELECT called_number, release_reason, COUNT(called_number) count_callsfailed 
    FROM callsfailed 
    GROUP BY called_number 
    HAVING COUNT(called_number) > 1 AND release_reason = -1 
) t1 

GROUP BY t1.called_number 

И у вас есть результат

+0

Это самый близкий ответьте спасибо, но только одна крошечная проблема, это дало мне 2020202 ......., но 2020202 произвело больше 25, поэтому я не хочу этого в результате. –

+0

Вы можете увидеть это sqlfield, это не дает мне 2020202 http://sqlfiddle.com/#!9/83c879/1 – Aroniaina

+0

ДА, это помогло мне Спасибо. Уважаемый: D –

2

Может быть, вы ищете присоединиться

select t1.called_number, t1.duration, t1.count 
    from 

    ( SELECT called_number, duration, COUNT(*) count 
    FROM calls 
    GROUP BY called_number 
    Having COUNT(called_number) > 1 and duration < 25 
) t1 

    left join 

    (SELECT called_number, release_reason, COUNT(*) count 
    FROM callsfailed 
    GROUP BY called_number 
    Having COUNT(called_number) > 1 and release_reason = -1 
) t2 on t1.called_number = t2.called_number 

Но для союза может вам нужно, где на длительность e release_reason

 SELECT called_number, duration, COUNT(*) count 
     FROM calls 
     WHERE duration < 25 
     GROUP BY called_number 
     Having COUNT(called_number) > 1 

     union 

     SELECT called_number, release_reason, COUNT(*) count 
     FROM callsfailed 
     GROUP BY called_number 
     where release_reason = -1 
     Having COUNT(called_number) > 1 
+0

I Got This [Err] 1052 - Столбец 'called_number' в списке полей неоднозначен –

+0

У меня есть ответ – scaisEdge

+0

[Err] 1052 - Столбец «count» в списке полей неоднозначен :( –

1

В вопросе имеется несколько пробелов.

  1. В ожидаемом результате не должно считаться с номером 1010101 на 5?
  2. Зависит от вызываемого_соединения между в двух таблицах?
  3. Ваш код имеет очень низкую вероятность получить желаемый результат.

Вот моя догадка о том, что вы хотите достичь

ВЫБРАТЬ T1.called_number (T1.C1 + T2.C2) AS отсчитываются от (SELECT called_number, COUNT () AS C1 FROM вызовов Где продолжительность < 25 GROUP BY called_number) Т1 JOIN (SELECT called_number, COUNT () в качестве С2 ОТ callsfailed ГДЕ release_reason = -1 GROUP BY called_number) T2 = ON T1.called_number T2.called_number ГДЕ (T1.C1 + Т2.C2)> 1;

+0

(1.The count не имеет значения, я имею в виду, что это должно быть больше 1) (2.duration и release_reason, они могут быть организованы от -1 до 25.) (3.It дал мне тот же результат, как ваш код :() и код дал мне этот результат: [1010101 - 5] [2020202 - 2], ((BUT 2020202 Проведено более 25 лет !!!)) –

+0

1. Быть основательным в целом помогает в жизни. 2. Ваш ответ не имеет никакого смысла. 3. Я не могу поверить, что ваш код и мой код дали вам тот же результат. –

+0

Ваш результат + --------------- + ---------- + ------- + | called_number | продолжительность | счет | + --------------- + ---------- + ------- + | 1010101 | 13 | 3 | | 1010101 | -1 | 2 | | 5050505 | -1 | 2 | + --------------- + ---------- + ------- + –

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