#mysql
#mysql
Вопрос:
я получил эти строки, например
id phoneNum status date
1 123456 no answer
2 123456 no answer
3 123456 no answer
4 123456 no answer
5 123456 no answer
6 123456 no answer
7 123456 ANSWERED
8 567890 no answer 2020-11-19 10:35:05
9 567890 no answer 2020-11-19 10:35:05
10 567890 no answer 2020-11-19 10:35:05
11 567890 no answer 2020-11-19 10:35:05
12 567890 no answer 2020-11-19 10:35:05
13 567890 no answer 2020-11-19 10:35:05
14 567890 no answer 2020-11-19 10:35:05
15 567890 no answer 2020-11-19 10:40:00
16 567890 no answer 2020-11-19 10:40:00
17 567890 no answer 2020-11-19 10:40:00
18 567890 no answer 2020-11-19 10:40:00
19 567890 no answer 2020-11-19 10:40:00
20 567890 no answer 2020-11-19 10:40:00
21 567890 ANSWERED 2020-11-19 10:40:00
для этого примера я хочу считать, только если ни на одну из строк не ПОЛУЧЕН ОТВЕТ,
и из этого примера я получу 1 в качестве результата, потому что на номер телефона 567890 вообще не было ОТВЕТА
. номер телефона — это входящий номер телефона, и он звонит с несколькими расширениями, поэтому моя БД получает все
данные о каждом вызове, и мне нужноподсчитать, сколько вызовов не ответили.
что такое оператор SELECT, который мне нужен для получения этого результата
спасибо 🙂
Комментарии:
1. Итак, что вы хотите знать, так это то, что ЕСЛИ вам НЕ ответил ни один, чтобы получить этот номер телефона и напечатать его только один раз? Я прав?
2. если вы замените «no answer» и «answered» на (например) ноль и единицу {0, 1}, тогда вы можете
GROUP BY
набрать номер телефона и искатьMIN
илиMAX
статус. Как и в ссылке, прокомментированной @Strawberry , было бы уместно предоставить полную схему таблицы, как и ваши предыдущие попытки запроса SQL.3. спасибо за повтор, когда я задаю вопрос в stuck overflow только после того, как я попробовал любой возможный способ, я не очень профессионален в mysql, мой пример выглядит просто, но он не так прост, как кажется, я пробовал с distinct , group by и не нашел правильного пути.
4. Эдуардо, да, и я хочу посчитать его как 1 для этого примера, спасибо
Ответ №1:
Предполагая, что 'no answer'
и 'ANSWERED'
являются единственными возможными значениями для столбца status
, если вам нужны phoneNum
s, для которых нет строки с status = 'ANSWERED'
, затем сгруппируйте по номеру телефона и задайте условие в предложении HAVING:
SELECT phoneNum
FROM tablename
GROUP BY phoneNum
HAVING SUM(status = 'ANSWERED') = 0
Если вы хотите посчитать телефонные номера, для которых нет ни одной строки status = 'ANSWERED'
, тогда используйте NOT EXISTS:
SELECT COUNT(DISTINCT phoneNum) counter
FROM tablename t
WHERE NOT EXISTS (SELECT 1 FROM tablename WHERE phoneNum = t.phoneNum AND status = 'ANSWERED')
Смотрите демонстрацию.
Комментарии:
1. У меня все еще есть проблема с результатами, если тот же номер вызывается снова и получает ответ, тогда счетчик получает минус 1 из-за отдельного источника, я хочу считать только отсутствие ответа от differnet date time, спасибо за любую помощь
2. Добавьте еще одно условие:
WHERE NOT EXISTS (SELECT 1 FROM tablename WHERE phoneNum = t.phoneNum AND date = t.date AND status = 'ANSWERED')