2017-10-09 9 views
0

私は「グループ」と呼ばれるテーブルと「サブスクリプション」と呼ばれる他のテーブルを持っています。mysqlにないところのクエリ

ユーザーが購読していないすべてのグループを戻したいとします。

基本的にこれは私が否定する条件である(のは、ID = 1のユーザのために仮定しましょうグループがアクティブ化されているかどうか、ステータスはちょうどチェックです):

SELECT * 
    FROM groups g 
    LEFT 
    JOIN subscriptions s 
    ON s.groups = g.id 
WHERE g.status = 1 
    AND s.user = 1 

このクエリは、すべてのグループを選択し、ユーザーが購読していた場所が、どこにいないのかが必要です。私の問題は、彼が購読していないときにこのユーザーに関連するテーブルには何もないので、私が何かのようなものを使用すれば、私は必要のないものを返すだろうということです。

私はNOT INまたはNOT EXISTSを使用して考えましたが、動作させることはできません。

皆さんはすばやく効果の高いソリューションをお持ちですか?私はuserは本当に私は引用符を削除する理由である数、であることを推測してい

SELECT * 
FROM `groups` G LEFT JOIN 
    `subscriptions` S 
    ON G.id = S.groups AND S.user = 1 
WHERE G.status = '1'; 

: はON句へテーブル上の条件非常

+0

に関連したレコードを取得する代わりにLEFT JOININNER JOINを使用することができます - 形式のテキストとして(画像ではありません) – jarlh

答えて

1

もっとありがとうございました。いずれにしても、数字ではなく文字列と日付定数に引用符を使用するだけです。

+1

あなたのヒントをありがとう、私はまだすべての結果を取得しています(ユーザーが購読しているものもあります)が、今は自分がいない場所にNULL値があることがわかります私の条件に何かを加えることができますS.user IS NULL – Ame

+1

@Ame:とvoilaのように、* anti-join *のパターンがあります... LEFT JOINを使って一致する行を見つけ、次にWHERE句の条件で、マッチした行だけを残してマッチする。 – spencer7593

-1

あなたはいくつかのサンプル表データと予想される結果を追加し、他の記録

SELECT * FROM `groups` AS G INNER JOIN `subscriptions` AS S ON G.id = S.groups WHERE G.status = '1' AND S.user = '1' 
0

使用このクエリ

SELECT * FROM groups g where g.ID not in(select groups from subscriptions) 
関連する問題