著者と国名を含む私のすべての本のリストが必要であると仮定しましょう。しかし、私が欲しいのは有名な作家だけです。有名でない場合は、国 ID 123 の作家でなければなりません。
SELECT book.id, author.name, country.name
FROM book
LEFT JOIN author ON author.id = book.authorid
LEFT JOIN country ON country.id = author.countryid
WHERE author.famous = 1 OR (author.famous = 0 AND country.id = 123)
このクエリは、有名な著者がいる、または国 123 のすべての本のリストを返します。ただし、著者のいない本も必要なので、「author.id is null or ...」を追加します。
SELECT book.id, author.name, country.name
FROM book
LEFT JOIN author ON author.id = book.authorid
LEFT JOIN country ON country.id = author.countryid
WHERE (author.id is null or (author.famous = 1 OR (author.famous = 0 AND country.id = 123)))
しかし、ここで問題が発生します。これで、有名な著者または 123 国の著者がいるすべての本と、著者がいない本があります。
しかし、有名でなく、国 123 以外の著者の本はリストにありません。これを 1 つのクエリで管理するにはどうすればよいですか? それとも、これは不可能で、サブクエリが必要ですか?
複数のテーブルに対して条件を結合する必要がありますが、それは不可能です。
ありがとう!
編集: 誰もが問題を理解していることを確認するためだけに。最後に、私のすべての本のリストが必要で、本の横に著者の情報が必要ですが、著者が有名であるか、countryid 123 の出身である場合に限ります。
クエリに誤りがあったため、より適切なクエリを使用します
SELECT book.id, author.name, country.name
FROM book
LEFT JOIN author ON author.id = book.authorid
LEFT JOIN country ON country.id = author.countryid
WHERE author.id is null OR author.famous = 1 OR country.id = 123
しかし、このクエリでは、countryid 123 以外の有名でない著者の本はまだ取得できません。これらの本を、横に著者情報を付けずにリストに含めたいと思います。
そのため、著者が有名ではなく、countryid 123 の出身でない場合、著者と一緒に本に参加したくありません。