2016-12-13 19 views
-1

私はpostgreSQLで私のクエリに問題があります。 最初のクエリ: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 

最初のクエリは私に私に少なくとも倍にした、あまりにもわずか1サービスを提供する必要があり、ほとんどの時間と2番目のクエリを作っただけで1サービスを与える必要があります。 問題はどちらのクエリでも同じ結果が得られます:すべてのサービスのリストとそれぞれの回数。

答えて

0

あなたはdistinct onを探しています。あなたが外側のクエリで集計キーでservice_name含めているので

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; 

あなたのクエリが失敗しますと最初のクエリが書き込まれます。これは内側のクエリと同じ集約なので、何もしません。あなたはMAX()関数が最大値を持つ行を返しますが、それがないことを願いMAX()するん

注意事項があります。

  • 表の別名を書くことや読むことをクエリが容易になります。
  • se.worker_idの条件は、LEFT JOININNER JOINに変えますので、そのテーブルにLEFT JOINを使用する理由はありません。
  • 実際にLEFT JOINが必要な場合は、条件がw.idになるはずです。
+0

大変感謝しています。私ははっきりとした機能の仕組みを学ばなければならない: – Patryk

1

cteを使用して読みやすくし、次にROW_NUMBER()を使用して、whoisと最も多くのものを見てください。

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 
関連する問題