0

著者と国名を含む私のすべての本のリストが必要であると仮定しましょう。しかし、私が欲しいのは有名な作家だけです。有名でない場合は、国 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 の出身でない場合、著者と一緒に本に参加したくありません。

4

4 に答える 4

1

まず、最初のクエリに間違いがあります。ここでauthor.famous = 1 OR (author.famous = 1 AND country.id = 123)は、著者が有名で 123 からの本のみを取得してますauthor.famous = 1 OR (author.famous = 0 AND country.id = 123)。2つの条件で十分です。

あなたはただ書くことができます:

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 country.id = 123)

2 番目のクエリについては、次のようにしてください。

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)
于 2013-08-21T09:12:48.670 に答える
1

このクエリを試してみてください:

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)

また、私は変わりました

or (author.famous = 1 AND country.id = 123)

or (author.famous = 0 AND country.id = 123)

なぜなら

または、有名でない場合は、国ID 123からのものでなければなりません

実際には、クエリと大差ありません。廃止された括弧を省略しただけですが、なぜ機能しないのかわかりません。あなたのデータベースには著者のいない本が実際に存在しますか?

于 2013-08-21T09:12:56.457 に答える
0

著者が author.famous = 1 の場合は有名で、0 の場合は有名ではないと仮定すると、条件が間違っているように見える最初のセットは、現在、国に関係なく有名な著者のみにフィルター処理されているように見えます。次のようになります。

WHERE author.famous = 1 OR country.id = 123

探している最終的なデータセットが結合されている場合:

  • 有名作家の全書(国問わず)
  • 国IDのすべての本は123です(名声に関係なく)
  • 著者のいないすべての本 (国に関係なく)

あなたの条件は次のとおりです。

WHERE author.famous = 1 OR country.id = 123 OR author.id is null
于 2013-08-21T09:18:09.437 に答える
0

このクエリを試してみてください。

SELECT book.id, if(author.famous <> 0 or country.id = 123,GROUP_CONCAT(author.*),null), country.name
FROM book
LEFT JOIN author ON author.id = book.authorid
LEFT JOIN country ON country.id = author.countryid

ありがとう

于 2013-08-21T09:14:49.810 に答える