Помогите составить SQL-запрос

MySQL/PostgreSQL/SQLite/Oracle/M$SQL/....

Модератор: terminus

Правила форума
Убедительная просьба юзать теги [code] при оформлении листингов.
Сообщения не оформленные должным образом имеют все шансы быть незамеченными.
Аватара пользователя
Electronik
капитан
Сообщения: 1593
Зарегистрирован: 2008-11-15 17:32:56
Откуда: Минск
Контактная информация:

Помогите составить SQL-запрос

Непрочитанное сообщение Electronik » 2011-04-30 20:10:19

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

Хостинговая компания Host-Food.ru
Хостинг HostFood.ru
 

Услуги хостинговой компании Host-Food.ru

Хостинг HostFood.ru

Тарифы на хостинг в России, от 12 рублей: https://www.host-food.ru/tariffs/hosting/
Тарифы на виртуальные сервера (VPS/VDS/KVM) в РФ, от 189 руб.: https://www.host-food.ru/tariffs/virtualny-server-vps/
Выделенные сервера, Россия, Москва, от 2000 рублей (HP Proliant G5, Intel Xeon E5430 (2.66GHz, Quad-Core, 12Mb), 8Gb RAM, 2x300Gb SAS HDD, P400i, 512Mb, BBU):
https://www.host-food.ru/tariffs/vydelennyi-server-ds/
Недорогие домены в популярных зонах: https://www.host-food.ru/domains/

Гость
проходил мимо

Re: Помогите составить SQL-запрос

Непрочитанное сообщение Гость » 2011-04-30 21:09:30

что то вообще не могу вьехать что такое уникальность? уникальность в чем? по номеру звонка? ну по номеру и сгрупируйте

а как одновременно звонок может быть и (A) AND (I) я вообще понять не могу

snorlov
подполковник
Сообщения: 3927
Зарегистрирован: 2008-09-04 11:51:25
Откуда: Санкт-Петербург

Re: Помогите составить SQL-запрос

Непрочитанное сообщение snorlov » 2011-04-30 23:17:00

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

Аватара пользователя
Electronik
капитан
Сообщения: 1593
Зарегистрирован: 2008-11-15 17:32:56
Откуда: Минск
Контактная информация:

Re: Помогите составить SQL-запрос

Непрочитанное сообщение Electronik » 2011-05-02 10:16:19

2 Guest
уникальность имеется ввиду что он только в пропущенных,т.е при запросе за день, этот номер будет только с параметром "А",пропущенным, а во входящих(параметр I) его не будет. Звонок одновременно A и I, быть не может, а вот с разницей в минуту да, параметр А появляется когда человек звонил, но трубку не подняли, а потом позвонил еще раз и трубку подняли, то этот звонок будет с параметром I, но с разницей в минуту или более, как повезёт.
2 snorlov
Спасибо попробую.
Предскажем будущее hw по логам и дампу, снимем сглаз и порчу с рута, поможем придумать пароль(С)
Блог

rmn
старшина
Сообщения: 427
Зарегистрирован: 2008-10-03 18:52:02

Re: Помогите составить SQL-запрос

Непрочитанное сообщение rmn » 2011-05-02 11:50:11

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
         // и после этого с этого номера больше не звонили.
    }
}

?>

FiL
ст. лейтенант
Сообщения: 1375
Зарегистрирован: 2010-02-05 0:21:40

Re: Помогите составить SQL-запрос

Непрочитанное сообщение FiL » 2011-05-03 0:37:10

не, ну какая проблема сделать запросом...

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

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

rmn
старшина
Сообщения: 427
Зарегистрирован: 2008-10-03 18:52:02

Re: Помогите составить SQL-запрос

Непрочитанное сообщение rmn » 2011-05-03 8:06:41

FiL писал(а):не, ну какая проблема сделать запросом...
например, было три звонка: первый пропущенный, второй раз на него ответили, третий пропущеный...

Аватара пользователя
Electronik
капитан
Сообщения: 1593
Зарегистрирован: 2008-11-15 17:32:56
Откуда: Минск
Контактная информация:

Re: Помогите составить SQL-запрос

Непрочитанное сообщение Electronik » 2011-05-04 20:00:11

2Fil
Спасибо как раз то что нужно было!!!

P.S.: А средствами SQL можно исключить одинаковые значения?
Предскажем будущее hw по логам и дампу, снимем сглаз и порчу с рута, поможем придумать пароль(С)
Блог

Аватара пользователя
Gamerman
капитан
Сообщения: 1723
Зарегистрирован: 2009-05-17 21:01:23
Откуда: Украина, Ужгород - Днепр
Контактная информация:

Re: Помогите составить SQL-запрос

Непрочитанное сообщение Gamerman » 2011-05-04 20:35:04

DISTINCT?
Глюк глюком вышибают!

snorlov
подполковник
Сообщения: 3927
Зарегистрирован: 2008-09-04 11:51:25
Откуда: Санкт-Петербург

Re: Помогите составить SQL-запрос

Непрочитанное сообщение snorlov » 2011-05-05 7:47:28

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')

Аватара пользователя
Electronik
капитан
Сообщения: 1593
Зарегистрирован: 2008-11-15 17:32:56
Откуда: Минск
Контактная информация:

Re: Помогите составить SQL-запрос

Непрочитанное сообщение Electronik » 2011-05-06 16:10:32

а это нормально что запрос

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

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 записей за этот период?
Предскажем будущее hw по логам и дампу, снимем сглаз и порчу с рута, поможем придумать пароль(С)
Блог

snorlov
подполковник
Сообщения: 3927
Зарегистрирован: 2008-09-04 11:51:25
Откуда: Санкт-Петербург

Re: Помогите составить SQL-запрос

Непрочитанное сообщение snorlov » 2011-05-06 16:57:16

Какой sql-сервер то, а так боюсь что да...

Аватара пользователя
Electronik
капитан
Сообщения: 1593
Зарегистрирован: 2008-11-15 17:32:56
Откуда: Минск
Контактная информация:

Re: Помогите составить SQL-запрос

Непрочитанное сообщение Electronik » 2011-05-06 17:09:01

MySQL 5.1.54 под 8.2-STABLE i386
серв Pentium D 825(2 ядра) 2.66 GHz. 2Gb RAM, 320 hdd SATAII.
Предскажем будущее hw по логам и дампу, снимем сглаз и порчу с рута, поможем придумать пароль(С)
Блог

Аватара пользователя
Electronik
капитан
Сообщения: 1593
Зарегистрирован: 2008-11-15 17:32:56
Откуда: Минск
Контактная информация:

Re: Помогите составить SQL-запрос

Непрочитанное сообщение Electronik » 2011-05-06 21:52:18

разобрался со временем, там индекс кривой был.
Предскажем будущее hw по логам и дампу, снимем сглаз и порчу с рута, поможем придумать пароль(С)
Блог

FiL
ст. лейтенант
Сообщения: 1375
Зарегистрирован: 2010-02-05 0:21:40

Re: Помогите составить SQL-запрос

Непрочитанное сообщение FiL » 2011-05-07 7:24:29

snorlov писал(а):
FiL писал(а):snorlov практически то самое написал, только не ясно зачем он во сложенный селецт пропущенные вставил. У него всегда все пропущенные выдаваться будут.
Там не только пропущенные, самотреть вниамтельней надо условия на тип звонка там стоит не

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

and way='I'
, а

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

 and ( way='I' OR way='A')
Именно! При таком запросе в any(.... and ( way='I' OR way='A')) попадут все просто пропущенные. Независимо от того, были отвеченные или нет. А это не то, что нужно автору.

Аватара пользователя
Electronik
капитан
Сообщения: 1593
Зарегистрирован: 2008-11-15 17:32:56
Откуда: Минск
Контактная информация:

Re: Помогите составить SQL-запрос

Непрочитанное сообщение Electronik » 2011-05-07 21:08:13

блин я что то не понимаю, делаю запрос за апрель, запрос выполняется за 0,9 сек, а за май 48,9 сек, из-за чего такая разница не пойму.
Предскажем будущее hw по логам и дампу, снимем сглаз и порчу с рута, поможем придумать пароль(С)
Блог

FiL
ст. лейтенант
Сообщения: 1375
Зарегистрирован: 2010-02-05 0:21:40

Re: Помогите составить SQL-запрос

Непрочитанное сообщение FiL » 2011-05-08 8:02:58

Electronik писал(а):блин я что то не понимаю, делаю запрос за апрель, запрос выполняется за 0,9 сек, а за май 48,9 сек, из-за чего такая разница не пойму.
звонков больше в мае? :)

Аватара пользователя
Gamerman
капитан
Сообщения: 1723
Зарегистрирован: 2009-05-17 21:01:23
Откуда: Украина, Ужгород - Днепр
Контактная информация:

Re: Помогите составить SQL-запрос

Непрочитанное сообщение Gamerman » 2011-05-08 11:02:51

либо ошибка в запросе, либо мускуль перебирает больше записей для поиска. можно попробовать проиндексировать по дате.
Глюк глюком вышибают!

Аватара пользователя
Electronik
капитан
Сообщения: 1593
Зарегистрирован: 2008-11-15 17:32:56
Откуда: Минск
Контактная информация:

Re: Помогите составить SQL-запрос

Непрочитанное сообщение Electronik » 2011-05-08 12:39:46

до этого стоял индекс по дате звонка, запрос из 22000 звонков строился 3-3,5 минуты.убрал индекс теперь запрос выполняется не более 1,5 секунд. в мае звонков не много всего пару тысяч, при этом запрос за 2 месяца выполняется за 1,5 секунды.
Предскажем будущее hw по логам и дампу, снимем сглаз и порчу с рута, поможем придумать пароль(С)
Блог

Аватара пользователя
Gamerman
капитан
Сообщения: 1723
Зарегистрирован: 2009-05-17 21:01:23
Откуда: Украина, Ужгород - Днепр
Контактная информация:

Re: Помогите составить SQL-запрос

Непрочитанное сообщение Gamerman » 2011-05-08 20:48:40

LIKE обязательно использовать? Может есть возможность без него обойтись?
Глюк глюком вышибают!

Аватара пользователя
Electronik
капитан
Сообщения: 1593
Зарегистрирован: 2008-11-15 17:32:56
Откуда: Минск
Контактная информация:

Re: Помогите составить SQL-запрос

Непрочитанное сообщение Electronik » 2011-05-08 23:22:35

в какой части запроса не использовать?
Предскажем будущее hw по логам и дампу, снимем сглаз и порчу с рута, поможем придумать пароль(С)
Блог

Аватара пользователя
Gamerman
капитан
Сообщения: 1723
Зарегистрирован: 2009-05-17 21:01:23
Откуда: Украина, Ужгород - Днепр
Контактная информация:

Re: Помогите составить SQL-запрос

Непрочитанное сообщение Gamerman » 2011-05-09 9:32:02

Везде. Не могу найти, а , возможно, это уже и не актуально, но помню, что для оптимизации всегда старались заменить LIKE на другое. ("=" например). Тем более, что у вас номер телефона - цифры.
Глюк глюком вышибают!

odiemus
мл. сержант
Сообщения: 78
Зарегистрирован: 2008-11-24 12:49:11
Откуда: Moscow
Контактная информация:

Re: Помогите составить SQL-запрос

Непрочитанное сообщение odiemus » 2011-05-31 17:28:53

Поставь перед SELECT оператор EXPLAIN, чтобы получилось EXPLAIN SELECT .....
и погляди, что выдаст explain, какие ключи использует и какие не использует при оптимизации запроса.
А дальше создай ключи на колонки, которые он использует, но на которых нет ключей.

Аватара пользователя
Gamerman
капитан
Сообщения: 1723
Зарегистрирован: 2009-05-17 21:01:23
Откуда: Украина, Ужгород - Днепр
Контактная информация:

Re: Помогите составить SQL-запрос

Непрочитанное сообщение Gamerman » 2011-05-31 19:18:35

Не факт, что это улучшит ситуацию. Да, для данного запроса будет плюс, но в целом ситуация может и ухудшится. Я к тому, что с индексами нужно работать с умом.
Глюк глюком вышибают!

odiemus
мл. сержант
Сообщения: 78
Зарегистрирован: 2008-11-24 12:49:11
Откуда: Moscow
Контактная информация:

Re: Помогите составить SQL-запрос

Непрочитанное сообщение odiemus » 2011-06-01 15:48:37

Gamerman писал(а):Не факт, что это улучшит ситуацию. Да, для данного запроса будет плюс, но в целом ситуация может и ухудшится. Я к тому, что с индексами нужно работать с умом.
сам explain еще не улучшит, он покажет, что и где можно улучшить :)