J'essaie de faire quelque chose comme ceci:
SELECT a.date AS EnrollDate, a.id, a.name, b.address FROM student a JOIN Location b ON a.id=b.id UNION SELECT a.date AS EnrollDate, a.id, a.name, b.address FROM teacher a JOIN Location b ON a.id=b.id WHERE a.date>'2010-01-01' ORDER BY EnrollDate
3 Réponses :
Il n'y en a aucun moyen, vous devez répéter le lieu où chaque clause de sélection individuelle. P>
Ok, en regardant les autres réponses, ma réponse est fausse car elle indique qu'il n'y en a aucun moyen. Cependant, d'un point de vue de la performance, je supposerais toutes les solutions de la première syndicalisation, puis en évaluant la situation où l'état sera probablement pire (si vous n'avez pas d'optimiseur vraiment intelligent, que je ne supposerais pas pour MySQL).
Appliquer le lieu de chaque partie individuellement est seulement meilleur s'il y a un index disponible pour qu'il soit utilisé. Notez également que l'union est plus lente que l'union tout, car elle a une étape supplémentaire d'éliminer les doublons.
Avez-vous essayé quelque chose comme:
SELECT * FROM
(
SELECT a.date AS EnrollDate, a.id, a.name, b.address FROM student a JOIN Location b ON a.id=b.id
UNION
SELECT a.date AS EnrollDate, a.id, a.name, b.address FROM teacher a JOIN Location b ON a.id=b.id
) A
WHERE a.date>'2010-01-01'
ORDER BY EnrollDate
Vous devez soit donner à la sous-requête un alias, soit remplacer «A.Date» avec simplement «date».
SELECT * FROM ( SELECT a.date AS EnrollDate, a.id, a.name, b.address FROM student a JOIN Location b ON a.id=b.id UNION SELECT a.date AS EnrollDate, a.id, a.name, b.address FROM teacher a JOIN Location b ON a.id=b.id ) A WHERE EnrollDate > '2010-01-01' ORDER BY EnrollDate This also has the advantage, compared to individual ORDER BY's that the whole result is correctly ordered.
En passant, la clause d'où devrait s'inscrire à l'instruction au lieu d'une comparaison;)
Notez que cela (au moins dans mon cas) ne spécifie pas les conditions sur les tableaux séparément, elle effectue la requête sur l'ensemble du jeu de résultats, considérant ainsi des lignes qui sont ensuite jetées. Dans mon cas (Total des rangées de 10 m), il n'est pas une solution pour l'utiliser de cette façon ...
Une base de données décente doit appuyer sur la condition code> Instroldate code> et ne pas générer un énorme ensemble de résultats intermédiaire. Mais vous pouvez bien sûr ajouter manuellement l'endroit où sélectionnez et laissez simplement la commande par code> pour garder tout le résultat commandé.
accepter les ANS si cela fonctionne pour vous