2016-04-19 14 views
1

Sagen wir, ich eine Frage haben:mit sich selbst in MySQL Join Abfrageergebnis

select product_id, price, price_day 
from products 
where price>10 

und ich möchte mit sich selbst das Ergebnis dieser Abfrage verbinden (wenn ich zum Beispiel in der gleichen Reihe Produktpreis erhalten möchten und der Preis in vorherigen Tage)

ich kann dies tun:

select * from 
(
select product_id, price, price_day 
from products 
where price>10 
) as r1 
join 
(
select product_id, price, price_day 
from products 
where price>10 
) as r2 
on r1.product_id=r2.product_id and r1.price_day=r2.price_day-1 

aber wie man sehen kann ich das Kopieren der ursprünglichen Abfrage, es eine andere Namensgebung Name, nur um sein Ergebnis mit sich selbst zu verbinden.

Eine andere Option ist, eine temporäre Tabelle zu erstellen, aber dann muss ich daran denken, sie zu entfernen.

Gibt es eine elegantere Möglichkeit, das Ergebnis einer Abfrage mit sich selbst zu verbinden?

+0

können Sie uns zeigen einen Teil der Produkte Tisch? imho Sie brauchen hier keine Verbindung –

+0

Produkte Tabelle ist einfach: Es enthält Produkt-ID, ein Preis für einen bestimmten Tag und die Seriennummer des Tages. –

+0

dann können Sie Pivot auf Daten verwenden ...... überprüfen http://StackOverflow.com/Questions/10428993/understanding-pivot-Function-in-T-SQL out .... –

Antwort

1

Self-Join-Abfrage

select a.product_ID,a.price 
     ,a.price_day 
     ,b.price as prevdayprice 
     ,b.price_day as prevday 
from Table1 a 
inner join table1 b 
on a.product_ID=b.product_ID and a.price_day = b.price_day+1 
where a.price >10 
helfen
-1

Nur um Duplikate in der gleichen Zeile zu bekommen?

select product_id as id1, price as price1, price_day as priceday1, product_id as id2, price as price2, price_day as priceday2, 
    from products 
    where price>10 
+0

Das ist nicht, was ich gefragt habe. Ich möchte den Preis für den PREVIOUS-Tag in derselben Reihe bekommen. –

+0

Ihre Select-Anweisungen sind genau die gleichen: Wählen Sie Produkt-ID, Preis, Preis-Tag und wählen Sie aus der gleichen Tabelle – user3791775

+0

Schauen Sie auf meine Bedingungen der Join –

1

Sie ein paar Dinge tun konnte, konnte nur ein paar Optionen sein:

  • mysql die Optimierung
    • dies wahrscheinlich feinen Griff Lassen Sie arbeiten, bis Sie viele getroffen Zeilen
  • Machen Sie eine Ansicht für Ihre Basisabfrage und verwenden Sie
    • konnte die Leistung steigern, sondern vor allem der Lesbarkeit erhöht (wenn es richtig gemacht)
  • Einsatz eine Tabelle (nicht temporär) und legen Sie Ihre ersten Zeilen drin. (unfortunately you cannot refer to a temporary table more than once in a query)
    • Dies wird wahrscheinlich teurer sein, bis eine bestimmte Anzahl von Zeilen erreicht ist.

Je nachdem, wie wichtig Leistung ist für Ihre Situation und wie viele Zeilen, die Sie brauchen, um mit der „besten“ Wahl ändern würde zu arbeiten.