2009-09-03 12 views
1

J'ai Table1 et Table2 liées à Table1.ID. Il peut y avoir zéro ou plusieurs enregistrements Table2 pour un Table1.ID donné. J'ai une vue où je veux obtenir Table2.Value où Table2.ID est max pour un Table1.ID donné. Un ami a suggéré une table dérivée, mais cela nécessite une sous-requête dans la clause from, et MySQL n'aime pas ça. Y a-t-il d'autres moyens de le faire? J'ai essayé de mettre en place une vue secondaire pour prendre la place de la sous-requête, mais cela semble très lent. J'ai également essayé d'utiliser une clause having pour tester Table2.ID = MAX (Table2.ID), mais elle ne reconnaît pas la colonne à moins que je ne la mette dans le groupe par, qui vissera tout le reste.MySql View - Valeur d'une colonne où une autre colonne est max

+0

Quelle version de MySQL utilisez-vous? Il devrait être très bien avec des sous-requêtes si vous utilisez 5.x – Wade

+0

Je suis sur la version 5.0. Les documents que j'ai lus et l'erreur que je reçois indiquent que les sous-requêtes de la clause from ne sont pas autorisées dans une vue. Est-ce seulement dans 5.0? –

+0

C'est un bug ouvert dans MySQL: http://bugs.mysql.com/bug.php?id=12755 –

Répondre

0
SELECT t1.*, t2a.* 
FROM Table1 t1 
LEFT JOIN Table2 t2a 
ON (t1.table1_id = t2a.table1_id) 
LEFT JOIN Table2 t2b 
ON (t1.table1_id = t2b.table1_id AND t2a.table2_id < t2b.table2_id) 
WHERE t2b.table2_id IS NULL 
AND t1.table1_id = ?; 
+0

Fonctionne bien! Beaucoup plus rapide que la vue secondaire. Merci. Des problèmes de performance que je devrais surveiller avec cette méthode? En ce qui concerne les tailles de table ou d'indexation ou quoi que ce soit? –

+0

Eh bien, vous devriez toujours analyser avec EXPLAIN toute requête dont vous avez besoin pour avoir de bonnes performances, et essayez de vous assurer qu'il utilise bien les index et ne fait pas de filesort/table temporaire. Mais cette requête est à peu près aussi évolutive que vous pouvez obtenir dans une base de données normalisée. –

+0

Ça a l'air génial. Merci encore pour votre aide. –

Questions connexes