2016-12-13 2 views
-1

У меня проблема с моими запросами в postgre sql. Первый запрос:Postgre: 2 разных запроса, но тот же результат

SELECT first_name, last_name, service_name, max(usluga) 
FROM (SELECT first_name, last_name, service_name, 
       count(scheduler_scheduleevents.id) as usluga 
     FROM workers_workers 
     LEFT JOIN scheduler_scheduleevents 
     ON scheduler_scheduleevents.worker_id = workers_workers.id 
     AND is_start_time = True 
     AND is_active = False 
     AND (scheduler_scheduleevents.date < %s 
       or (scheduler_scheduleevents.date = %s and time < %s)) 
     LEFT JOIN user_settings_userservices 
     ON user_settings_userservices.id =scheduler_scheduleevents.service_type_id 
     WHERE workers_workers.salonid_id= %s 
     AND scheduler_scheduleevents.worker_id = %s 
     GROUP BY workers_workers.id, service_name 
    ) as x 
GROUP BY x.first_name, x.last_name, x.service_name 

И Второе:

SELECT first_name, last_name, service_name, min(usluga) 
FROM (SELECT first_name, last_name, service_name, 
       count(scheduler_scheduleevents.id) as usluga 
     FROM workers_workers 
     LEFT JOIN scheduler_scheduleevents 
     ON scheduler_scheduleevents.worker_id = workers_workers.id 
     AND is_start_time = True 
     AND is_active = False 
     AND (scheduler_scheduleevents.date < %s 
      or (scheduler_scheduleevents.date = %s and time < %s)) 
     LEFT JOIN user_settings_userservices 
     ON user_settings_userservices.id =scheduler_scheduleevents.service_type_id 
     WHERE workers_workers.salonid_id= %s 
     and scheduler_scheduleevents.worker_id = %s 
     GROUP BY workers_workers.id, service_name 
    ) as x 
GROUP BY first_name, last_name, service_name 

Первый запрос должен дать мне только один сервис, который был сделан больше времени и второй запрос должен дать мне тоже только один сервис, который был сделан наименее раз. Проблема заключается в том, что оба запроса дают мне одинаковые результаты: список всех служб и количество раз, сколько было сделано.

ответ

0

Вы ищете distinct on, я думаю. Первый запрос должен быть написан так:

SELECT DISTINCT ON (first_name, last_name) x.* 
FROM (SELECT first_name, last_name, service_name, count(se.id) as usluga 
     FROM workers_workers w JOIN 
      scheduler_scheduleevents se 
      ON se.worker_id = w.id AND is_start_time = True AND 
       is_active = False AND 
       (se.date < %s or 
       se.date = %s and time < %s 
       ) LEFT JOIN 
      user_settings_userservices uss 
      ON uss.id = se.service_type_id 
     WHERE w.salonid_id= %s AND se.worker_id = %s 
     GROUP BY w.id, service_name 
    ) x 
ORDER BY first_name, last_name, usluga DESC; 

Ваш запрос не будет, потому что вы в том числе в агрегации ключей во внешнем запросе service_name. Это та же совокупность, что и внутренний запрос, поэтому он ничего не делает. Вы можете желания что функция MAX() возвращает строку с максимальным значением, но это не то, что делает MAX()

Примечания:

  • Таблица псевдонимы сделать запрос легче писать и читать.
  • Состояние на se.worker_id превращает LEFT JOIN в INNER JOIN, поэтому нет причин использовать LEFT JOIN для этой таблицы.
  • Возможно, вы действительно захотите LEFT JOIN, если это так, условие должно быть на w.id.
+0

Это большое спасибо. Я должен узнать, как работает функция: P – Patryk

1

Используйте cte, чтобы сделать его более читаемым, а затем используйте ROW_NUMBER(), чтобы узнать, кто наименее и в основном.

WITH cte as (
    SELECT first_name, last_name, service_name, 
      count(scheduler_scheduleevents.id) as usluga, 
      ROW_NUMBER() OVER (ORDER BY count(scheduler_scheduleevents.id asc)) as min_usluga, 
      ROW_NUMBER() OVER (ORDER BY count(scheduler_scheduleevents.id desc)) as max_usluga, 
      FROM workers_workers 
      LEFT JOIN scheduler_scheduleevents 
      ON scheduler_scheduleevents.worker_id = workers_workers.id 
      AND is_start_time = True 
      AND is_active = False 
      AND (scheduler_scheduleevents.date < %s 
       or (scheduler_scheduleevents.date = %s and time < %s)) 
      LEFT JOIN user_settings_userservices 
      ON user_settings_userservices.id =scheduler_scheduleevents.service_type_id 
      WHERE workers_workers.salonid_id= %s 
      and scheduler_scheduleevents.worker_id = %s 
      GROUP BY workers_workers.id, service_name 
) 
SELECT * 
FROM cte 
WHERE min_usluga = 1 
--WHERE max_usluga = 1 
Смежные вопросы