2017-06-08 4 views
0

私は正しい質問のタイトルを思いつくことが困難でした。私はそれを編集するために任意のアドバイスをします。postgresの結合テーブルによる行の整列

私の問題:ユーザー仕事:私は2つのモデルとアプリ(ジョブボード)を持っています。ユーザーは多くのジョブを持つことができ、ジョブはpremiumまたはfreeになります。ジョブは、が有効期限が切れたまたはアクティブでも可能です。 valid_untilパラメータIS NOT NULLの場合は有効です。それ以外の場合は有効期限が切れています(毎日自動的にこれを設定するバックグラウンドジョブがあります)。

私は、アクティブなジョブを持っているが、私はプレミアム仕事とユーザーがと仮定し、ユーザーが同時にアクティブプレミアムの両方で無料の求人を持つことができる無料のジョブで、ユーザーの前に来たいユーザーを選択しようとしています。問い合わせの上

SELECT DISTINCT users.id, users.email FROM users 
LEFT OUTER JOIN jobs ON jobs.owner_id = users.id 
WHERE jobs.valid_until IS NOT NULL; 

が正常に少なくとも一つのアクティブなジョブを持つユーザー(プレミアムまたはフリーのいずれか)を選択し、私はちょうど仕事の表に従ってユーザーを注文する必要があります。私は助けとヒントを感謝します。ありがとう!

+0

ジョブをまったく持っていないユーザーがいないように、(内側の)join left joinを使用する必要はありません。ここでは、有効な/有効なジョブのテストでそれらの失業者が排除されるので、左端の結合が機能します。しかし、あなたがjobs.valid_until IS NULLを要求した場合、あなたはまた、失業中のユーザーを取得します。左結合は、内部結合の戻り値と、NULLで拡張された不一致の左テーブル行を返します。 – philipxy

答えて

2

私は次のようにあなたがやりたいと考えている。

SELECT users.id, users.email FROM users 
JOIN jobs ON jobs.owner_id = users.id 
WHERE jobs.valid_until IS NOT NULL 
GROUP BY users.id, users.email 
ORDER BY min(case when jobs.type = 'premium' then 1 else 2 end) 

私はFreePremiumを保持するフィールドの名前を見ることができなかったので、私は1つのアップを作りましたよ!また、私はあなたのJOINをに変更しました。なぜなら、WHERE句はどんな場合でもその趣旨があるからです。

+0

集計関数を使用せずにGROUP BY節を使用しているとわかりません... – Arkhena

+0

@Arkhena、ORDER BYの集計に必要です...重複を削除してDISTINCTを必要としません。 –

関連する問題