2010-12-10 4 views
1

Mes tableaux sont les suivants:MYSQL Max (colonne) où 2 tables ont la même colonne

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..." 
... 

(les tables alignées à vol1.book = books.abbr, dans cet exemple, je montre que correspondant Vol1.) Donc, pour trouver le dernier chapitre d'un livre pour le volume 1, il est simple de trouver le dernier chapitre d'un livre pour le volume 1. Je fais ceci:

SELECT MAX(chapter) FROM vol1, books WHERE vol1.book=books.abbr 
AND books.volume='SLZT' AND books.name ='Gazo'; 

qui fonctionne bien. MAIS, et si je voulais inclure tout dans vol2 dans la même requête?

J'ai essayé:

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

qui bien sûr me donne une erreur qui dit chapitre est ambigu car il est utilisé deux fois.

En outre, je vais faire les valeurs 'SLZT' et 'Gazo' dans les variables d'exemple dans le code réel. Donc, essentiellement, j'aimerais pouvoir entrer n'importe quel livre/volume et trouver la valeur du chapitre le plus élevé, qu'il soit en vol1 ou en vol2.

J'espère avoir conçu la question assez bien pour fournir toutes les informations nécessaires. Et merci!

:: Modifier

Quelqu'un a posté la solution suivante et il est proche - la chose étrange est qu'il a disparu des réponses! Ils ont suggéré d'utiliser 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' 

Cela me donne (par exemple):

MAX(chapter) 
50 
NULL 

Mais comment puis-je obtenir pour revenir seulement la valeur 50 (la valeur non nulle) de la table?

+0

Une raison pour laquelle vous ne mettez pas simplement les deux dans une table et avez une colonne de volume? –

Répondre

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

J'ai essayé, mais je ne suis pas sûr d'avoir trouvé la bonne déclaration, donc ça n'a pas l'air de marcher pour moi. – dijon

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

Je ne pouvais pas obtenir ce travail, voir modifier dans mon post ci-dessus où quelqu'un a suggéré UNION - qui semble le plus proche. – dijon

0

Dans ce cas, vous devriez regarder l'optimisation de votre structure db en combinant 2 tables de volume en un seul. Cela rendrait votre requête plus facile à écrire et probablement plus rapide. Vous ne voulez vraiment pas créer une nouvelle table chaque fois que vous importez un livre avec plus de volumes que votre nombre actuel de tables.

+0

Il n'y aurait pas d'ajout de livres ou de volumes dans cette base de données, c'est un travail de référence seulement fini. – dijon