Страница 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 практически то самое написал, только не ясно зачем он во сложенный селецт пропущенные вставил. У него всегда все пропущенные выдаваться будут.
Там не только пропущенные, самотреть вниамтельней надо условия на тип звонка там стоит не

Код: Выделить всё

and way='I'
, а

Код: Выделить всё

 and ( way='I' OR way='A')

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 практически то самое написал, только не ясно зачем он во сложенный селецт пропущенные вставил. У него всегда все пропущенные выдаваться будут.
Там не только пропущенные, самотреть вниамтельней надо условия на тип звонка там стоит не

Код: Выделить всё

and way='I'
, а

Код: Выделить всё

 and ( way='I' OR way='A')
Именно! При таком запросе в 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 еще не улучшит, он покажет, что и где можно улучшить :)