MYSQL Max(列),其中2个表具有相同的列

时间:2010-12-10 18:23:32

标签: php mysql

我的表格如下:

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值(即非空值)?

3 个答案:

答案 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个卷表合并为一个来优化数据库结构。这将使您的查询更容易编写,可能更快。每次导入的卷都比当前表的数量多时,您真的不想创建新表。