2017-02-12 6 views
0

将来的に他の人に役立つかもしれないので、これを一般化しようとしています。idを基にしたすべての行を含む2つのテーブル

例として、私は書籍を2つ持っていて、もう1つは読んだ本を持っているユーザーです。すべての書籍を表示し、一時的な列の値を(yes/noまたは0/1)、私は結合を試みたが、(WHERE user_id = 3)句は、1つの行だけを返し、他のすべての行は返しません。

book.book_id  book.book_name 
    10     Book 1 
    11     Book 2 
    12     Book 3 

------------- 

user.user_id user.book_id 
     1     10 
     1     12 
     2     11 
     3     12 


Desired output: 

user_id  book_id  temp_col_read 
     3   10   0 // yes, on or null 
     3   12   1 // or yes 
     3   13   0 
+0

を読んでいませんケース –

+0

@SamKuhmonenです。申し訳ありませんが、私の質問には私が試した事例はありません。左外部結合は機能しませんでした。 – david

答えて

1

これは実際には非常に簡単です。ユーザーがブックを複数回読むことができる場合には、私はselectexistsとなるだろう:

MySQLで
select b.*, 
     (case when exists (select 1 
          from reads r 
          where r.book_id = b.book_id and r.user_id = 3 
         ) 
      then 1 else 0 
     end) as user_read_book 
from book b; 

ブール式は、多くの中で0/1として扱われるため、caseは厳密には必要ではありませんコンテキスト:

select b.*, 
     (exists (select 1 
       from reads r 
       where r.book_id = b.book_id and r.user_id = 3 
     ) as user_read_book 
from book b; 
+0

はいユーザーが複数の本を読むことができましたが存在しました選択しました、ありがとうございます。 – david

1

あなたは左を使用することができます参加し、どこに参加未解決であるが、その後あなたは番目のために `LEFT OUTER JOIN`が必要

select 
     user.user_id 
     , book.book_id 
     , case 
      when book.book_id is null 
       then 'NO' else 'YES' 
     end as temp_col_read 
    from book 
    left join user on user.book_id = book.book_id 
関連する問題