2012-04-15 16 views
1

Gibt es eine Möglichkeit, eine Unterabfrage in einer Union zu referenzieren?MYSQL, Unterabfrage in Union

Ich versuche, so etwas wie die folgenden zu tun, und möchte eine temporäre Tabelle vermeiden, aber die Unterabfrage wird von einer viel größeren Datenmenge gezogen werden, so dass es sinnvoll ist es nur einmal tun ..

SELECT * FROM (SELECT * FROM ads WHERE state='FL' AND city='Maitland' AND page='home' ORDER BY RAND()) AS sq WHERE spot = 'full-banner' LIMIT 1 
UNION 
SELECT * FROM sq WHERE spot = 'leaderboard' LIMIT 1 
UNION 
SELECT * FROM sq WHERE spot = 'rectangle1' LIMIT 1 
UNION 
SELECT * FROM sq WHERE spot = 'rectangle2' LIMIT 1 
.... etc,, 

Es ist eine Schande, dass DISTINCT nicht für eine einzelne Spalte einer Ergebnismenge angegeben werden kann.

Antwort

1

Nun, es gibt keine Möglichkeit zu tun, was Sie tun möchten, ohne die Erstellung der abgeleiteten Tabelle zu wiederholen.

Wenn ads Abfrage ist wirklich teuer, dann sollten Sie wie einen Index versuchen Sie:

alter table ads add index (state, city, page, spot); 

Wenn nach diesem Index Hinzufügen der Abfrage zu viel nimmt, dann würde ich empfehlen, eine Tabelle erstellen, diese Daten zu speichern und Dann frage diese Tabelle für jeden Punkt ab.

Abhängig von Ihren Daten können Sie mit GROUP BY spielen, um ähnliche Ergebnisse zu erhalten.

+0

Weil tbl nur eine Referenz für die erste Unterabfrage ist. Vielleicht ist der Name ein bisschen verwirrend. Die Ads-Tabelle ist groß, aber nach der Unterabfrage sind es nur etwa 90 Zeilen. Ich werde den Aliasnamen aktualisieren, um Verwechslungen zu vermeiden. – christian

+0

Verstanden. Meine Antwort wurde aktualisiert. –

+1

Meine ersten Tests zeigen, dass das Folgende tut, was ich will! .... SELECT * FROM (SELECT * VON Anzeigen WHERE state = 'FL' UND city = 'Maitland' ORDER BY RAND()) sq GROUP BY sq .spot ... Also gibt GROUP BY nur ein Ergebnis pro Klausel zurück? Ich dachte, es wäre ORDER BY ähnlich. Vielen Dank – christian