Страница 1 из 2
Помогите составить SQL-запрос
Добавлено: 2011-04-30 20:10:19
Electronik
настроил ATSLog, и теперь немного допиливаю под себя, и возникала проблема с составлением нового отчёта.
таблица с данными о звонках имеет такой вид
Код: Выделить всё
timeofcall forwarded internally co way number duration cost
2011-03-31 17:04:20 NULL 3205 7002 I 37529******* 129 0.000
Так вот поле "way" может принимать значения I(вх.)/O(исх.)/A(пропущеный).
Я делаю запрос за день, по пропущенным звонкам
Код: Выделить всё
SELECT * FROM calls
WHERE timeofcall like '2011-03-31 %' AND way='A'
И по входящим
Код: Выделить всё
SELECT * FROM calls
WHERE timeofcall like '2011-03-31 %' AND way='I'
Как совместить эти 2 запроса, так что бы можно было отследить смог человек дозвониться или нет. Т.е отобразить уникальные записи за день в пропущенных звонках.
Re: Помогите составить SQL-запрос
Добавлено: 2011-04-30 21:09:30
Гость
что то вообще не могу вьехать что такое уникальность? уникальность в чем? по номеру звонка? ну по номеру и сгрупируйте
а как одновременно звонок может быть и (A) AND (I) я вообще понять не могу
Re: Помогите составить SQL-запрос
Добавлено: 2011-04-30 23:17:00
snorlov
Вы должны будете сделать выборку по 2.условиям: 1.дозвонившемся и 2.номер должен числиться в пропущенных/дозвонившихся
Код: Выделить всё
SELECT * FROM calls
WHERE timeofcall like '2011-03-31 %' AND way='A' and number = any(SELECT dictinct number FROM calls WHERE timeofcall like '2011-03-31 %' AND (way='A' or way='I'))
более точно можно сказать только отталкиваясь от самого sql-сервера... Хотя например с одного номера могут звонить разные люди, поэтому надо бы делать сортировку по номеру, дальше тип звонка, потом время...
Re: Помогите составить SQL-запрос
Добавлено: 2011-05-02 10:16:19
Electronik
2 Guest
уникальность имеется ввиду что он только в пропущенных,т.е при запросе за день, этот номер будет только с параметром "А",пропущенным, а во входящих(параметр I) его не будет. Звонок одновременно A и I, быть не может, а вот с разницей в минуту да, параметр А появляется когда человек звонил, но трубку не подняли, а потом позвонил еще раз и трубку подняли, то этот звонок будет с параметром I, но с разницей в минуту или более, как повезёт.
2 snorlov
Спасибо попробую.
Re: Помогите составить SQL-запрос
Добавлено: 2011-05-02 11:50:11
rmn
sql-запросом такого не сделаешь, если учитывать все возможности.
как вариант:
Код: Выделить всё
<?php
$PhoneNumbers = array();
$result = mysql_query("SELECT * FROM calls WHERE timeofcall like '2011-03-31 %' AND way IN('A', 'I') ORDER BY timeofcall");
while($row = mysql_fetch_assoc($result))
{
$PhoneNumbers[$row['number']]['time'] = $row['timeofcall'];
$PhoneNumbers[$row['number']]['missed'] = (($row['way'] == 'I')?false:true);
}
while(list($number, $info) = each($PhoneNumbers))
{
if ($info['missed'] === true)
{
// В $info['time'] был пропущенный звонок с $number
// и после этого с этого номера больше не звонили.
}
}
?>
Re: Помогите составить SQL-запрос
Добавлено: 2011-05-03 0:37:10
FiL
не, ну какая проблема сделать запросом...
Код: Выделить всё
select * from calls where timeofcall like '2011-03-31 %' AND way='A' and number not in (select number from calls where timeofcall like '2011-03-31 %' AND way='I');
Вот только что делать если СНАЧАЛА был отвеченный, а потом 10 раз пробовал перезвонить и не смог?
snorlov практически то самое написал, только не ясно зачем он во сложенный селецт пропущенные вставил. У него всегда все пропущенные выдаваться будут.
Re: Помогите составить SQL-запрос
Добавлено: 2011-05-03 8:06:41
rmn
FiL писал(а):не, ну какая проблема сделать запросом...
например, было три звонка: первый пропущенный, второй раз на него ответили, третий пропущеный...
Re: Помогите составить SQL-запрос
Добавлено: 2011-05-04 20:00:11
Electronik
2Fil
Спасибо как раз то что нужно было!!!
P.S.: А средствами SQL можно исключить одинаковые значения?
Re: Помогите составить SQL-запрос
Добавлено: 2011-05-04 20:35:04
Gamerman
DISTINCT?
Re: Помогите составить SQL-запрос
Добавлено: 2011-05-05 7:47:28
snorlov
Electronik писал(а):2Fil
Спасибо как раз то что нужно было!!!
P.S.: А средствами SQL можно исключить одинаковые значения?
select dictinct .... group by ...
FiL писал(а):не, ну какая проблема сделать запросом...
Код: Выделить всё
select * from calls where timeofcall like '2011-03-31 %' AND way='A' and number not in (select number from calls where timeofcall like '2011-03-31 %' AND way='I');
Вот только что делать если СНАЧАЛА был отвеченный, а потом 10 раз пробовал перезвонить и не смог?
snorlov практически то самое написал, только не ясно зачем он во сложенный селецт пропущенные вставил. У него всегда все пропущенные выдаваться будут.
Там не только пропущенные, самотреть вниамтельней надо условия на тип звонка там стоит не
, а
Re: Помогите составить SQL-запрос
Добавлено: 2011-05-06 16:10:32
Electronik
а это нормально что запрос
Код: Выделить всё
SELECT calls.timeofcall,calls.number,calls.duration,calls.way,extlines.name,intphones.name,calls.co,calls.internally,phonebook.description from calls LEFT JOIN extlines ON calls.co = extlines.line LEFT JOIN intphones ON calls.internally = intphones.intnumber LEFT JOIN phonebook ON calls.number LIKE phonebook.number OR calls.number LIKE phonebook.number where (calls.timeofcall between '2011-04-01 00:00:00' AND '2011-04-30 23:59:59' AND calls.way='A' AND calls.number not in (SELECT calls.number from calls where calls.timeofcall between '2011-04-01 00:00:00' AND '2011-04-30 23:59:59' AND calls.way='I'))
выполняется около 3-3.5 минут, в базе порядка 25000 записей за этот период?
Re: Помогите составить SQL-запрос
Добавлено: 2011-05-06 16:57:16
snorlov
Какой sql-сервер то, а так боюсь что да...
Re: Помогите составить SQL-запрос
Добавлено: 2011-05-06 17:09:01
Electronik
MySQL 5.1.54 под 8.2-STABLE i386
серв Pentium D 825(2 ядра) 2.66 GHz. 2Gb RAM, 320 hdd SATAII.
Re: Помогите составить SQL-запрос
Добавлено: 2011-05-06 21:52:18
Electronik
разобрался со временем, там индекс кривой был.
Re: Помогите составить SQL-запрос
Добавлено: 2011-05-07 7:24:29
FiL
snorlov писал(а):
FiL писал(а):snorlov практически то самое написал, только не ясно зачем он во сложенный селецт пропущенные вставил. У него всегда все пропущенные выдаваться будут.
Там не только пропущенные, самотреть вниамтельней надо условия на тип звонка там стоит не
, а
Именно! При таком запросе в any(.... and ( way='I' OR way='A')) попадут все просто пропущенные. Независимо от того, были отвеченные или нет. А это не то, что нужно автору.
Re: Помогите составить SQL-запрос
Добавлено: 2011-05-07 21:08:13
Electronik
блин я что то не понимаю, делаю запрос за апрель, запрос выполняется за 0,9 сек, а за май 48,9 сек, из-за чего такая разница не пойму.
Re: Помогите составить SQL-запрос
Добавлено: 2011-05-08 8:02:58
FiL
Electronik писал(а):блин я что то не понимаю, делаю запрос за апрель, запрос выполняется за 0,9 сек, а за май 48,9 сек, из-за чего такая разница не пойму.
звонков больше в мае?

Re: Помогите составить SQL-запрос
Добавлено: 2011-05-08 11:02:51
Gamerman
либо ошибка в запросе, либо мускуль перебирает больше записей для поиска. можно попробовать проиндексировать по дате.
Re: Помогите составить SQL-запрос
Добавлено: 2011-05-08 12:39:46
Electronik
до этого стоял индекс по дате звонка, запрос из 22000 звонков строился 3-3,5 минуты.убрал индекс теперь запрос выполняется не более 1,5 секунд. в мае звонков не много всего пару тысяч, при этом запрос за 2 месяца выполняется за 1,5 секунды.
Re: Помогите составить SQL-запрос
Добавлено: 2011-05-08 20:48:40
Gamerman
LIKE обязательно использовать? Может есть возможность без него обойтись?
Re: Помогите составить SQL-запрос
Добавлено: 2011-05-08 23:22:35
Electronik
в какой части запроса не использовать?
Re: Помогите составить SQL-запрос
Добавлено: 2011-05-09 9:32:02
Gamerman
Везде. Не могу найти, а , возможно, это уже и не актуально, но помню, что для оптимизации всегда старались заменить LIKE на другое. ("=" например). Тем более, что у вас номер телефона - цифры.
Re: Помогите составить SQL-запрос
Добавлено: 2011-05-31 17:28:53
odiemus
Поставь перед SELECT оператор EXPLAIN, чтобы получилось EXPLAIN SELECT .....
и погляди, что выдаст explain, какие ключи использует и какие не использует при оптимизации запроса.
А дальше создай ключи на колонки, которые он использует, но на которых нет ключей.
Re: Помогите составить SQL-запрос
Добавлено: 2011-05-31 19:18:35
Gamerman
Не факт, что это улучшит ситуацию. Да, для данного запроса будет плюс, но в целом ситуация может и ухудшится. Я к тому, что с индексами нужно работать с умом.
Re: Помогите составить SQL-запрос
Добавлено: 2011-06-01 15:48:37
odiemus
Gamerman писал(а):Не факт, что это улучшит ситуацию. Да, для данного запроса будет плюс, но в целом ситуация может и ухудшится. Я к тому, что с индексами нужно работать с умом.
сам explain еще не улучшит, он покажет, что и где можно улучшить
