0

次のクエリを考えると…</p>

  SELECT   DISTINCT *
  FROM     PAS_Post
  WHERE    post_user_id = 21
  GROUP BY post_post_id 

UNION

  SELECT   DISTINCT PAS_Post.*
  FROM     PAS_Follow LEFT JOIN PAS_Post ON (
             PAS_Follow.folw_followed_user_id = PAS_Post.post_user_id
           )
  WHERE    PAS_Follow.folw_follower_user_id = 21
  GROUP BY post_post_id

ORDER BY post_posted_date DESC

私は常に NULL だけの結果の行を取得します。残念ながら、Post のテーブル (PAS_Post) にはさまざまな種類の情報が保持されているため、データに NULL 値を保持する必要があります。

このヌル行を取り除くために、誰かが私を正しい方向に導くことができますか?

ここに画像の説明を入力

ここに最後の行は必要ありません

4

1 に答える 1

2

の 2 番目の部分で (左) 外部結合を使用しているUNIONため、結合基準を満たさない場合は、結合 ( PAS_Follow)の左側のテーブルからのデータになりNULLますが、テーブルのすべての列に結合の右側 ( PAS_Post); その後、後者のテーブルから列のみを選択すると、NULL観察した行が得られます。したがって、最も簡単な解決策は、内部結合 (結合条件を満たさないレコードを完全に除外する) を使用することです。

ただし、あなたの場合、結合されたテーブルではなく、結合されたテーブルのフィルターで2つの可能な条件を使用するだけで、クエリを大幅に簡素化できるようですUNION

SELECT   p.*
FROM     PAS_Post   AS p
    JOIN PAS_Follow AS f ON f.folw_followed_user_id = p.post_user_id
WHERE    p.post_user_id = 21
      OR f.folw_follower_user_id = 21
ORDER BY p.post_posted_date DESC

テーブルの主キー (または少なくとも) でGROUP BYあるという前提で句を除外しました。その仮定が正しくない場合は、再度導入することをお勧めしますが、MySQL は各グループから返される値を不確定に選択することに注意してください。post_post_idUNIQUEPAS_Post

于 2013-05-21T10:09:48.963 に答える