我的表格如下:
books:
id | abbr | volume | name |
1 | GZ | SLZT | Gazo |
...
vol1:
id | book | chapter | line
1 | GZ | 1 | "text..."
...
vol2:
id | book | chapter | line
1 | SD | 1 | "more..."
...
(表格对齐vol1.book = books.abbr,在本例中我只显示Vol1匹配。)
因此,要找到第1卷的书的最后一章很简单。我这样做:
SELECT MAX(chapter) FROM vol1, books WHERE vol1.book=books.abbr
AND books.volume='SLZT' AND books.name ='Gazo';
工作正常。但是,如果我想将vol2中的所有内容都包含在同一个查询中呢?
我试过了:
Select Max(chapter) FROM vol1,vol2,books
WHERE (vol1.book=books.abbr OR vl2.book=books.abbr)
AND books.volume='SLZT' AND books.name = 'Gazo';
当然这给了我一个错误,说明章节含糊不清,因为它被使用了两次。
另外,我将在实际代码中的示例变量中设置值'SLZT'和'Gazo'。
所以,基本上,我希望能够输入任何书籍/卷并找到最高章的值,无论它是在vol1还是vol2。
希望我已经很好地提出了这个问题,以提供所需的所有信息。谢谢!
修改:: 的
有人发布了以下解决方案并且它已接近 - 奇怪的事情是它从答案中消失了!他们建议使用 UNION :
SELECT MAX(chapter) FROM vol1
JOIN books ON vol1.book = books.abbr
WHERE books.volume = 'SLZT' AND books.name = 'Gazo'
UNION
SELECT MAX(chapter) FROM vol2
JOIN books ON vol2.book = books.abbr
WHERE books.volume = 'SLZT' AND books.name = 'Gazo'
这给了我(例如):
MAX(chapter)
50
NULL
但是如何让它只返回表格的50值(即非空值)?
答案 0 :(得分:0)
SELECT IF(`vol1`.`Chapter` > `vol2`.`Chapter`,`vol1`.`Chapter`,`vol2`.`Chapter`) AS `Max` FROM ...
答案 1 :(得分:0)
Select GREATEST(vl1.Max(Chapter),vl2.Max(Chapter)) FROM books
left join vol1 on vl1.book=books.abbr
left join vol2 on vl2.book=books.abbr
WHERE books.volume='SLZT' AND books.name = 'Gazo';
答案 2 :(得分:0)
在这种情况下,您应该通过将2个卷表合并为一个来优化数据库结构。这将使您的查询更容易编写,可能更快。每次导入的卷都比当前表的数量多时,您真的不想创建新表。