2010-12-10 62 views
1

我的表如下:MYSQL最大(列),其中2个表有相同的列

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

任何原因,你不只是把两个在一个表中,并有一个卷列? – 2010-12-10 18:27:43

回答

0
SELECT IF(`vol1`.`Chapter` > `vol2`.`Chapter`,`vol1`.`Chapter`,`vol2`.`Chapter`) AS `Max` FROM ... 
+0

我试过这个,但我不确定我是否完整的陈述,所以它似乎没有为我工作。 – dijon 2010-12-11 19:09:50

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'; 
+0

我无法得到这个工作,看到在我的帖子上面有人建议联合编辑 - 这似乎是最接近的。 – dijon 2010-12-11 19:09:24

0

在这种情况下,你应该看看通过组合2个表到一个优化你的数据库结构。这会使您的查询更容易编写,并且可能更快。如果您每次输入书籍的卷数超过当前的表数,则实际上不希望创建新的表。

+0

在这个数据库中不会添加书或卷,它只是一个完成的参考工作。 – dijon 2010-12-11 18:24:57