2016-11-21 12 views
0

2つのテーブルがあり、最初にアナウンスを格納し、2番目にアナウンスを読み込んだユーザーのリストを格納します。私はすべてのアナウンスを読み込みまたは未読のステータスでキャプチャしようとしています。 2番目のテーブルに、そのannouncement_idに対応するuser_idの行が含まれていない場合は、未読です。ここでは、それはMYSQL - 他のテーブルと結合していないすべての行を選択

お知らせのよう

id | content | announce_on 
1 | foo  | 2016-11-10 
2 | bar  | 2016-11-11 
3 | zim  | 2016-11-12 

発表ビューカウント

id | user_id | announcement_id 
1 | 1  | 1 
2 | 1  | 2 
3 | 2  | 1 
4 | 2  | 3 

(ユーザー1、ユーザー2が発表1を読んでいる、発表1と2を読んでいる)

最高どのように見えるのです私が今までに持っているものは、

SELECT 
    *, 
    a.id AS annId 
FROM 
    announcement a 
LEFT JOIN 
    announcement_view_count avc 
ON 
    avc.announcement_id = a.id 
WHERE 
    a.announce_on <= CURRENT_DATE AND (avc.user_id = 1 OR avc.user_id IS NULL) 
です0

問題は私が発表3を全く得ないことです。 avc.user_id IS NULLの部分が正常に動作していません。発表3はユーザー2が閲覧したため表示されません。

説明は難しいですが、すべてのアナウンスを読み込み、そのアナウンスが特定のユーザーによって表示されたかどうかを示す1つの列があります。 (誰が誰が利用できるか)。誰かが私にヒントを与えることができますか?

私はまた、存在していないし、試してみましたが、空の結果を返します。

+0

を – e4c5

+0

あなたが提供していない列名への参照をしているあなたの「これまでのベストなもの」あなたの説明。あなたが提供したテーブルデータに基づいて、日付との関係は何ですか?あなたは私たちにもっと話す必要があるのですか、すでに提供しているもの、あなたが意図したものですか? Iそれぞれ3つの列を持つ2つの表のみが表示されます。 – TimBrownlaw

+0

申し訳ありません。私は不必要な列を含めたくありませんでした。お知らせ3が読み込まれたので、もう一度 – VeeK

答えて

0

私はあなたが必要とするものを理解していると思います。次に、アナウンスが特定のユーザーによって読み取られたかどうかを示す列が追加されたすべてのアナウンスのリストが必要です。その場合は、ユーザー条件のフィルタをwhere句のグローバル条件としてではなく、結合条件内に追加する必要があります。あなたはこのようなものを使用することができます:あなたが投稿したテーブルがクエリに一致していないので、誰もあなたのクエリを試すことができません

SELECT 
    a.*, 
    (avc.announcement_id is not NULL) wasRead 
FROM 
    announcement a 
LEFT JOIN 
    announcement_view_count avc 
ON 
    (avc.announcement_id = a.id AND avc.user_id = 1) 
WHERE 
    a.announce_on <= CURRENT_DATE 
GROUP BY a.id 
+0

華麗な男。私はIS NULL部分から同じものをキャプチャしようとしていました。すべての 'フィルタ'を削除すると、user_idはあなたのコードでキャプチャされたものとしてnullになります。誰が下降? – VeeK

+0

誰が落としたのかわからない、私は私のアプローチが間違っていることを知りたいので、改善できる。 – phobia82

+0

私はまさに私が欲しかったものを得ました。 – VeeK

0

私はこの問題を理解していませんが、ユーザーがアナウンスメントを読んだ場合に保存できる余分な列を作成するために、これを使用できます。

CASE case_value 
    WHEN when_value THEN statements 
    ELSE statements 
END 
関連する問題