Aliasing table dérivée qui est une union de deux sélectionne
Je ne peux pas obtenir la syntaxe de la droite pour créer un alias de la table dérivée correctement:
SELECT * FROM
(SELECT a.*, b.*
FROM a INNER JOIN b ON a.B_id = b.B_id
WHERE a.flag IS NULL AND b.date < NOW()
UNION
SELECT a.*, b.*
FROM a INNER JOIN b ON a.B_id = b.B_id
INNER JOIN c ON a.C_id = c.C_id
WHERE a.flag IS NOT NULL AND c.date < NOW())
AS t1
ORDER BY RAND() LIMIT 1
Que je vais avoir un Double nom de la colonne de B_id. Des suggestions?
OriginalL'auteur jontyc | 2011-11-29
Vous devez vous connecter pour publier un commentaire.
Le problème n'est pas la
union
, c'est laselect a.*, b.*
dans chaque de la sélection interne des états - depuisa
etb
les deux ontB_id
colonnes, cela signifie que vous avez deuxB_id
cols dans le résultat.Vous pouvez corriger cela en changeant le sélectionne à quelque chose comme:
En général, je préfère éviter d'utiliser
select table1.*
dans les requêtes que vous utilisez à partir de code (plutôt que de simplement requêtes interactives). Si quelqu'un ajoute une colonne à la table, les diverses requêtes peuvent soudainement s'arrêter de travailler.Si vous supprimez la sélection externe, alors vous n'êtes pas à l'aide de la table dérivée comme un tableau, c'est un simple
SELECT
et en tant que tel, il n'a pas besoin d'avoir différents noms de colonne, vous pouvezSELECT
comme répété plusieurs colonnes que vous le souhaitezIl a obtenu, grâce.
OriginalL'auteur babbageclunk
Dans votre table dérivée, vous récupérez l'id de colonne qui existe dans le tableau a et b, donc vous devez choisir l'une ou de donner un alias:
OriginalL'auteur Lamak
Tout d'abord, vous pouvez utiliser
UNION ALL
au lieu deUNION
. Les deux sous-requêtes auront pas la même rangées en raison de l'exclusion de condtion sura.flag
.Une autre façon, vous pouvez l'écrire, est:
J'ai en effet choisi de réécrire.
Lire cet article aussi, parce que
ORDER BY RAND()
est lent: titov.net/2005/09/21/...Et ceci: stackoverflow.com/questions/1244555/...
Et ceci: stackoverflow.com/questions/211329/...
OriginalL'auteur ypercubeᵀᴹ