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 个查询中管理这个?或者这是不可能的,我需要一个子查询吗?

我应该对多个表有连接条件,但这是不可能的。

谢谢!

编辑: 只是为了确保每个人都理解这个问题。最后我想要一个我所有书籍的列表,在书籍旁边我想要作者的信息,但前提是作者很有名或者他来自国家 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)但这也没有用。两个条件就够了。

你可以写:

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)

对于第二个查询,试试这个:

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

试试这个查询,你会得到任何书:

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 回答
0

假设作者在 author. Famous = 1 时是著名的,而在 0 时不是著名的,那么您的第一组 where 条件看起来是错误的,它目前看起来只过滤到著名作者,而不管国家/地区,它应该是:

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 回答