powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Помогите с запросом
7 сообщений из 7, страница 1 из 1
Помогите с запросом
    #33569344
Vic2000
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Доброго времени суток!
Есть две таблицы -тип запроса:t_query_type и непосредственно сами запросы: t_querys. Состав полей таблицы t_query_type:(id_type, name), а таблицы t_querys :(id_query, dt, id_type, query). Таблицы связаны по полю id_type. Мне необходимо подсчитать сколько запросов конкретного типа поступило, причем результирующее множество должно содержать столбец t_query_type.name и результирующий набор должен включать и типы запросов, которые ни разу не поступили, т. е. что-то типа этого:
name count
----- -------
type1 2
type2 1
type3 0

Строю такой запрос:
Код: plaintext
1.
2.
3.
4.
SELECT t_query_type.name, count(t_querys.id_query)
FROM t_query_type
    LEFT JOIN t_querys on t_query_type.id_type = t_querys.id_type
GROUP BY t_query_type.name
Все работает прекрасно и выводит все правильно (результат см. выше)
А вот теперь вопрос: как написать запрос, если мне надо подсчитать количество запросов в каком-то временном интервале? Почему-то запрос
Код: plaintext
1.
2.
3.
4.
5.
SELECT t_query_type.name, count(t_querys.id_query)
FROM t_query_type
    LEFT JOIN t_querys on t_query_type.id_type = t_querys.id_type
WHERE dt < '<какая-то дата>' 
GROUP BY t_query_type.name
выводит только те строки, для которых значение функции COUNT != 0, т.е:
name count
----- -------
type1 2
type2 1

Хотя если сделать запрос вида:
Код: plaintext
1.
2.
3.
4.
5.
SELECT t_query_type.name, count(t_querys.id_query)
FROM t_query_type
    LEFT JOIN t_querys on t_query_type.id_type = t_querys.id_type
WHERE query is not NULL
GROUP BY t_query_type.name
т.е. все не пустые запросы, то все выводит правильно!
...
Рейтинг: 0 / 0
Помогите с запросом
    #33569394
фффф
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Подзапросом проще всего
Код: plaintext
1.
2.
3.
4.
5.
6.
SELECT t_query_type.name, 
  (SELECT count(t_querys.id_query)
  FROM t_querys 
  WHERE t_query_type.id_type = t_querys.id_type
    AND dt < '<какая-то дата>' ) as cnt
FROM t_query_type
...
Рейтинг: 0 / 0
Помогите с запросом
    #33569438
Владимор Конев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vic2000Доброго времени суток!
Есть две таблицы -тип запроса:t_query_type и непосредственно сами запросы: t_querys. Состав полей таблицы t_query_type:(id_type, name), а таблицы t_querys :(id_query, dt, id_type, query). Таблицы связаны по полю id_type. Мне необходимо подсчитать сколько запросов конкретного типа поступило, причем результирующее множество должно содержать столбец t_query_type.name и результирующий набор должен включать и типы запросов, которые ни разу не поступили, т. е. что-то типа этого:
name count
----- -------
type1 2
type2 1
type3 0

Строю такой запрос:
Код: plaintext
1.
2.
3.
4.
SELECT t_query_type.name, count(t_querys.id_query)
FROM t_query_type
    LEFT JOIN t_querys on t_query_type.id_type = t_querys.id_type
GROUP BY t_query_type.name
Все работает прекрасно и выводит все правильно (результат см. выше)
А вот теперь вопрос: как написать запрос, если мне надо подсчитать количество запросов в каком-то временном интервале? Почему-то запрос
Код: plaintext
1.
2.
3.
4.
5.
SELECT t_query_type.name, count(t_querys.id_query)
FROM t_query_type
    LEFT JOIN t_querys on t_query_type.id_type = t_querys.id_type
WHERE dt < '<какая-то дата>' 
GROUP BY t_query_type.name
выводит только те строки, для которых значение функции COUNT != 0, т.е:
name count
----- -------
type1 2
type2 1

Хотя если сделать запрос вида:
Код: plaintext
1.
2.
3.
4.
5.
SELECT t_query_type.name, count(t_querys.id_query)
FROM t_query_type
    LEFT JOIN t_querys on t_query_type.id_type = t_querys.id_type
WHERE query is not NULL
GROUP BY t_query_type.name
т.е. все не пустые запросы, то все выводит правильно!Ну, это вполне объяснимое и предсказуемое поведение сервера!!! Ведь при таком написании запроса сервер его отработает примерно следующим образом: Выполнит внешнее соединение таблиц, а потом наложит условия фильтрации на полученную выборку. Для того, что бы запрос работал корректно, нужно сделать обратное - вначале наложить условия фильтрации на таблицу, а уж потом засунуть её во внешнее соединение.
В ANSI-SQL допускается вот такой вариант действия в этом случае:
Код: plaintext
1.
2.
3.
4.
5.
6.
SELECT t_query_type.name, count(t_querys.id_query)
FROM t_query_type
    LEFT JOIN t_querys on t_query_type.id_type = t_querys.id_type AND dt < '<какая-то дата>' 
-- То есть условие по ограничению дат 
-- сносим в конструкцию(выражение) соединения JOIN, 
-- а не во фразу WHERE
GROUP BY t_query_type.name
Вот только я не знаю, умеет ли Postgre так делать...
Если не умеет, то, возможно, вот такой вариант запроса тебе поможет:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
SELECT t_query_type.name, count(t_querys.id_query)
FROM t_query_type
    LEFT JOIN t_querys on t_query_type.id_type = t_querys.id_type
WHERE (
          dt < '<какая-то дата>'  
          or dt is null
      )
GROUP BY t_query_type.name
...
Рейтинг: 0 / 0
Помогите с запросом
    #33569444
Владимор Конев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Владимор Конев...Однако, правильнее-таки будет вариант с указанием условий фильтрации во фразе соединения JOIN.

Или использовать встроенное представление, примерно вот так:
Код: plaintext
1.
2.
3.
4.
5.
SELECT t_query_type.name, count(t_querys.id_query)
FROM t_query_type
    LEFT JOIN 
    (select * from t_querys WHERE dt < '<какая-то дата>'  ) t_querys 
    on t_query_type.id_type = t_querys.id_type
GROUP BY t_query_type.name
...
Рейтинг: 0 / 0
Помогите с запросом
    #33570142
4321
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
кроме того, что вам уже ответил ВК (вернее расшифровывая 3-ю часть его ответа):
если фильтр идет по левой стороне лефт джойна, и вам нужны 1. все записи, где поле равно фильтру, _или_ +2. все, где нет левой части в соединении, то поросту надо правильно писать _именно_такой_фильтр_.
Код: plaintext
1.
2.
3.
4.
5.
SELECT t_query_type.name, count(t_querys.id_query)
FROM t_query_type
    LEFT JOIN t_querys on t_query_type.id_type = t_querys.id_type
WHERE dt < '<какая-то дата>' 
OR t_querys.id_type IS NULL
GROUP BY t_query_type.name
это настолько очевидно, что, кажется, не заслуживает и разбора.

и соединять по сложным условиям постгрес таки умеет (по крайней мере с 7.4.)
...
Рейтинг: 0 / 0
Помогите с запросом
    #33571505
Funny_Falcon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Владимор Конев
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
SELECT t_query_type.name, count(t_querys.id_query)
FROM t_query_type
    LEFT JOIN t_querys on t_query_type.id_type = t_querys.id_type AND dt < '<какая-то дата>' 
-- То есть условие по ограничению дат 
-- сносим в конструкцию(выражение) соединения JOIN, 
-- а не во фразу WHERE
GROUP BY t_query_type.name

Это будет работать !!!!!!!! (и 4321 тоже это говорит)
У меня подобная фигня была, также перенес условие в джоин.
...
Рейтинг: 0 / 0
Помогите с запросом
    #33572380
Владимор Конев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
4321и соединять по сложным условиям постгрес таки умеет (по крайней мере с 7.4.) Funny_FalconЭто будет работать !!!!!!!! (и 4321 тоже это говорит)
Ну, буду знать на будущее.
Просто сам я не местный - PostgeSQL видел два раза в жизни и один раз писал под него пару несложных запросов :). Вот и предостерег вопрошающего на всякий случай, поставив его в известность о том, что я не уверен в 100% работоспособности приведенного мною кода...
...
Рейтинг: 0 / 0
7 сообщений из 7, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Помогите с запросом
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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