powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Помогите разобраться с запросом
25 сообщений из 29, страница 1 из 2
Помогите разобраться с запросом
    #39952403
otrazhenie
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Доброго дня.
Помогите разобраться с запросом:
SELECT COUNT(*) FROM cdr WHERE dst = 320 AND CHAR_LENGTH(src) = 3 AND calldate >= '$res1' AND calldate < '$res2'
тут мне все понятни и все работает на ура.
НО!
когда нужен групповой запрос типа:
SELECT COUNT(*) FROM cdr WHERE dst IN(320,322,323,324,325,326,327,381,383,384,388,431,435) AND CHAR_LENGTH(src) > 3 AND calldate >= '$res1' AND calldate < '$res2' GROUP BY dst

то отображаются только не нулевые значения.
Во всех справочниках * (звездочка) отображение всех значений......
Куда копать и где искать?
...
Рейтинг: 0 / 0
Помогите разобраться с запросом
    #39952410
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
otrazhenie
Во всех справочниках * (звездочка) отображение всех значений......
Старайтесь читать до конца предложения. Звёздочка - это вывод всех ПОЛЕЙ.
...
Рейтинг: 0 / 0
Помогите разобраться с запросом
    #39952412
Фотография Alex_Ustinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
есть же разница в условиях, может дело в этом?
Код: sql
1.
2.
3.
4.
5.
SELECT COUNT(*) FROM cdr WHERE dst = 320 AND CHAR_LENGTH(src) = 3 AND calldate >= '$res1' AND calldate < '$res2'
тут мне все понятни и все работает на ура.
НО!
когда нужен групповой запрос типа:
SELECT COUNT(*) FROM cdr WHERE dst IN(320,322,323,324,325,326,327,381,383,384,388,431,435) AND CHAR_LENGTH(src)  > 3 AND calldate >= '$res1' AND calldate < '$res2' GROUP BY dst
...
Рейтинг: 0 / 0
Помогите разобраться с запросом
    #39952413
otrazhenie
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Хорошо, тогда как мне сделать запрос, чтобы выводились и нулевые значения?
Я такого пока не нашел. Вот и обратился за помощью.
дело не в том что больше или равно...да пофиг на это!
разница по группе или одиночный запрос!
...
Рейтинг: 0 / 0
Помогите разобраться с запросом
    #39952427
Фотография Alex_Ustinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
так мы не знаем ваши данные.
в первом CHAR_LENGTH(src) = 3
во втором CHAR_LENGTH(src) > 3
нужны данные и наполнение чтобы понять
...
Рейтинг: 0 / 0
Помогите разобраться с запросом
    #39952677
DYUMON
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
попробуй вместо SELECT COUNT(*) подставить имя конкретного столбца.
...
Рейтинг: 0 / 0
Помогите разобраться с запросом
    #39952684
otrazhenie
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
DYUMON
попробуй вместо SELECT COUNT(*) подставить имя конкретного столбца.

пробовал. Нету нулей.
Нужен оператор подсчета строк с нулем. Я такого не знаю.
...
Рейтинг: 0 / 0
Помогите разобраться с запросом
    #39952801
DYUMON
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Чистоту данных проверял? может нет таких записей.
...
Рейтинг: 0 / 0
Помогите разобраться с запросом
    #39952831
otrazhenie
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
поэтому и должен быть ноль.
В первом случае он выводится....во втором нет (пропускается)
...
Рейтинг: 0 / 0
Помогите разобраться с запросом
    #39952853
Gluck99
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
otrazhenie,
Разбейте запрос на несколько:
Код: sql
1.
SELECT * FROM cdr WHERE dst IN(320,322,323,324,325,326,327,381,383,384,388,431,435) 


Код: sql
1.
SELECT COUNT(*) FROM cdr WHERE dst = 320 AND CHAR_LENGTH(src) = 3 AND calldate >= '$res1' AND calldate < '$res2'


Код: sql
1.
SELECT COUNT(*) FROM cdr WHERE dst IN(320,322,323,324,325,326,327,381,383,384,388,431,435) GROUP BY dst


Код: sql
1.
SELECT COUNT(*) FROM cdr WHERE CHAR_LENGTH(src)  > 3 AND calldate >= '$res1' AND calldate < '$res2' GROUP BY dst


Посмотрите в чём разница, и где теряется ваш ноль. Т.е. последовательно убираем условия и наблюдаем за результатом. А пытаться предугадывать действия сервера - пустая трата времени и нервов, не делайте так, в конкретном случае вы не умнее компьютера и данных.
...
Рейтинг: 0 / 0
Помогите разобраться с запросом
    #39952912
otrazhenie
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
разбивал....ноль теряется при переходе на WHERE dst IN
...
Рейтинг: 0 / 0
Помогите разобраться с запросом
    #39952922
Gluck99
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
otrazhenie
разбивал....ноль теряется при переходе на WHERE dst IN
Приведите CREATE таблицы и примеры данных, чтобы записи были одновременно "с нулём" (я так и не понял что это) и "без нуля". Тогда можно будет что-то сказать. Или гадайте дальше на кофейной гуще.
...
Рейтинг: 0 / 0
Помогите разобраться с запросом
    #39953173
otrazhenie
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
база телефонной станции.
структура в файле.
мне нужна статистика по входящим звонкам за период с разбивкой по внутренним номерам.

так вот. если делать запрос по каждому номеру
Код: sql
1.
SELECT COUNT(*) FROM cdr WHERE dst = 320 AND CHAR_LENGTH(src) = 3 AND calldate >= '$res1' AND calldate < '$res2'


то запрос возвращает 0 если записей с такими условиями нет.
но множественные запросы сильно нагружают сервер и по времени это долго и я решил оптимизировать запрос. Вместо множества одиночных сделать один.
Код: sql
1.
SELECT COUNT(*) FROM cdr WHERE dst IN(320,322,323,324,325,326,327,381,383,384,388,431,435) AND CHAR_LENGTH(src) = 3 AND calldate >= '$res1' AND calldate < '$res2' GROUP BY dst



запрос прекрасно отрабатывает и по времени и по нагрузке....НО нет нулей если записей с такими условиями нет.

соответственно заполнение таблицы значениями плывет.

Код: php
1.
2.
3.
4.
5.
6.
$result2 = mysqli_query($link, "SELECT COUNT(*) FROM cdr WHERE dst IN(320,322,323,324,325,326,327,381,383,384,388,431,435) AND disposition = 'NO ANSWER' AND calldate >= '$res1' AND calldate < '$res2' GROUP BY dst");
	$array2 = array();
	while ($row2 = mysqli_fetch_row($result2)) 
		{
		$array2[] = $row2['0'];
		}


думаю понятно объяснил что мне надо.
...
Рейтинг: 0 / 0
Помогите разобраться с запросом
    #39953353
Gluck99
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
otrazhenie,
Чему равен COUNT(*) в первом случае и во втором?
...
Рейтинг: 0 / 0
Помогите разобраться с запросом
    #39954481
otrazhenie
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Gluck99,
в первом случае он равен 0
во втором случае из 13 позиций опроса выдается только 9 значений. Пустые нулевые значения запроса отбрасываются.
...
Рейтинг: 0 / 0
Помогите разобраться с запросом
    #39954533
kolobok0
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
otrazhenie,

у вас в части запроса IN сравниваются с конкретными значениями . NULL (насколько я понял речь про это) не является явным значением - оно обрабатывается отдельными условиями типо IS NULL или NOT NULL.

как исправить. да очень просто.
1) превратить значения поля dst, в случае NULL в некое число, которое не может быть в IN (например в 0)
2) добавить принудительно это число внутрь скобочек IN
3) если требуется различать эти случаи на клиенте - анализировать возвращаемое значение поля dst

как то так
(круглый)
ЗЫ
Для подстановки в бд некоего значения вместо NULL обычно применяют встроенные функции. Для оракла это был вроде nvl, для postgres вроде как coalesce, для мускуля - вроде как так-же подходит coalesce. Более того coalesce это вроде как стандарт ANSI SQL...
...
Рейтинг: 0 / 0
Помогите разобраться с запросом
    #39954648
otrazhenie
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
kolobok0,
Параметр IN дает перечисление значений поля dst в запросе а надо анализировать COUNT(*) на NULL
так вот,
на выходе у меня многомерный массив:
Array ( [0] => Array ( [0] => 320 [1] => 1 ) [1] => Array ( [0] => 322 [1] => 1 ) [2] => Array ( [0] => 324 [1] => 1 ) [3] => Array ( [0] => 325 [1] => 11 ) [4] => Array ( [0] => 381 [1] => 6 ) [5] => Array ( [0] => 383 [1] => 4 ) [6] => Array ( [0] => 384 [1] => 6 ) [7] => Array ( [0] => 388 [1] => 4 ) )
как видите поле с dst 323 отсутствует.
Тогда такой вопрос...
КАК мне выцепить в переменную по значению например Array ( [0] => 320 [1] => 1 ) значение второго столбца ([1])? и не париться с этими нулями.
...
Рейтинг: 0 / 0
Помогите разобраться с запросом
    #39955154
kolobok0
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
otrazhenie,

если Вам необходимо сформировать строку которой нет во входящем множестве - то можно сделать джоин который это позволяет. т.е. на входе - ваше множество айдишников определённого поля, и вы связываете записи из таблицы. тогда в получаемых записях вы получите ваши нули, если айди будет отсутствовать в данных.

это что ли?
(круглый)
...
Рейтинг: 0 / 0
Помогите разобраться с запросом
    #39955166
otrazhenie
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
kolobok0,
думаю тут JOIN не совсем подойдет.
он объединяет таблицы, а мне нужно объединить поле dst с результатом запроса COUNT(*) .
...
Рейтинг: 0 / 0
Помогите разобраться с запросом
    #39955509
kolobok0
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
otrazhenie
...мне нужно объединить поле dst с результатом запроса COUNT(*) .


вот ваша фраза - это третье уже задания которое Вам надо сделать?

исходя из вашего первого вопроса в топике, необходимо :
чтобы count посчитал выборку по тем перечисленным значениям dst которые приведены в IN (...) даже если таких значений dst нет в таблице. при этом если значений нет в таблице то необходимо вернуть пустые поля в результирующих записях. т.е. если в скобочках IN () перечислено 5 значений, то независимо от существования таких dst в таблице count должен вернуть 5...

так? или вы меняете хотелки по мере общения в топике?

если я правильно понял первый ваш вопрос - то ответ я уже дал выше. использовать join который вам будет выдавать пустые поля, на ваши все перечисление поля dst.
(круглый)
...
Рейтинг: 0 / 0
Помогите разобраться с запросом
    #39955523
Фотография Alex_Ustinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
otrazhenie
kolobok0,
думаю тут JOIN не совсем подойдет.
он объединяет таблицы, а мне нужно объединить поле dst с результатом запроса COUNT(*) .
LEFT JOIN нужен
...
Рейтинг: 0 / 0
Помогите разобраться с запросом
    #39956079
otrazhenie
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Alex_Ustinov
otrazhenie
kolobok0,
думаю тут JOIN не совсем подойдет.
он объединяет таблицы, а мне нужно объединить поле dst с результатом запроса COUNT(*) .
LEFT JOIN нужен

и КАК мне его применить?
...
Рейтинг: 0 / 0
Помогите разобраться с запросом
    #39956097
Фотография Alex_Ustinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
otrazhenie,

задачу еще раз сформулируйте, без привязки с первому топику
приведите пример того, что вы хотите видеть в результате запроса
...
Рейтинг: 0 / 0
Помогите разобраться с запросом
    #39956284
otrazhenie
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Alex_Ustinov,
хорошо.....в общем есть групповой запрос
Код: plsql
1.
SELECT COUNT(*) FROM cdr WHERE dst IN(320,322,323,324,325,326,327,381,383,384,388,431,435) AND CHAR_LENGTH(src)  > 3 AND calldate >= '$res1' AND calldate < '$res2' GROUP BY dst


состоит из 13 пунктов в поле dst.
Проблема в том что на выходе COUNT(*) есть нулевые результаты, которые отбрасываются. Массив сдвигается. Мне нужно либо привязать результат Count(*) к полю dst, либо выводить нулевые, NULL, или пустое поле - мне не важно.
На выходе имею многомерный массив вида:
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
Array (
	[0] => Array (  [0] => 320 
				[1] => 1 ) 
	[1] => Array (  [0] => 322
				[1] => 1 ) 
	[2] => Array (  [0] => 324 
				[1] => 1 ) 
	[3] => Array (  [0] => 325
				[1] => 11 )
	[4] => Array (  [0] => 381
				[1] => 6 )
	[5] => Array (  [0] => 383 
				[1] => 4 )
	[6] => Array (  [0] => 384
				[1] => 6 )
	[7] => Array (  [0] => 388
				[1] => 4 )
	)


в массиве присутствуют не все значения dst.
Надеюсь понятно объяснил
...
Рейтинг: 0 / 0
Помогите разобраться с запросом
    #39956331
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
otrazhenie
на выходе COUNT(*) есть нулевые результаты, которые отбрасываются
Не на "выходе COUNT(*)", а на "выходе WHERE" остаются только те записи, которые прошли фильтрацию. Если записи с каким-либо dst не прошли, то COUNT(*) о них уже и не узнает.

Если вам принципиально надо получить в результате запроса полный набор dst, то сложите их в табличку и сделайте LEFT JOIN от нее. Если это не принципиально, то на php, мне кажется, решить было бы проще.
...
Рейтинг: 0 / 0
25 сообщений из 29, страница 1 из 2
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Помогите разобраться с запросом
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]