Aliasing abgeleitete Tabelle, die eine Vereinigung von zwei Selects ist

Ich kann die Syntax nicht richtig zum Aliasing der abgeleiteten Tabelle richtig erhalten:

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 

Ich erhalte den doppelten Spaltennamen B_id. Irgendwelche Vorschläge?

Solutions Collecting From Web of "Aliasing abgeleitete Tabelle, die eine Vereinigung von zwei Selects ist"

Das Problem ist nicht die union , es ist die select a.*, b.* In jeder der inneren Select-statementen – da a und b beide B_id Spalten haben, bedeutet das, dass Sie zwei B_id im Ergebnis haben.

Sie können das beheben, indem Sie die Auswahl auf Folgendes ändern:

 select a.*, b.col_1, b.col_2 -- repeat for columns of b you need 

Im Allgemeinen würde ich die Verwendung von select table1.* In Abfragen vermeiden, select table1.* Sie aus Code verwenden (anstatt nur interaktive Abfragen). Wenn jemand eine Spalte zur Tabelle hinzufügt, können verschiedene Abfragen plötzlich nicht mehr funktionieren.

In Ihrer abgeleiteten Tabelle rufen Sie die Spalten-ID ab, die in Tabelle a und Tabelle b vorhanden ist. Sie müssen also eine davon auswählen oder ihnen einen Alias ​​geben:

 SELECT * FROM (SELECT a.*, b.[all columns except id] 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.[all columns except id] 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 

Erstens könnten Sie UNION ALL anstelle von UNION . Die beiden Unterabfragen haben aufgrund der Ausschlussbedingung auf a.flag keine gemeinsamen Zeilen.

Eine andere Möglichkeit, um es zu schreiben, ist:

 SELECT a.*, b.* FROM a INNER JOIN b ON a.B_id = b.B_id WHERE ( a.flag IS NULL AND b.date < NOW() ) OR ( a.flag IS NOT NULL AND EXISTS ( SELECT * FROM c WHERE a.C_id = c.C_id AND c.date < NOW() ) ) ORDER BY RAND() LIMIT 1