2010-12-09 16 views
1

Dies ist meine erste Frage, also versuchte ich klar zu sein (es ist nicht zu lang hoffen!)MySQL (und PHP) einzelne Abfrage, einzelne Tabelle, mehrere Qualifier

Ich bin mit MySQL und PHP, um zu versuchen und Vergleichen Sie Daten in einer PHP-Tabelle, die aus einer MySQL-Tabelle von Verkaufsdaten mit ungefähr folgender Struktur stammen (die Daten stellen mehrere Produkte dar, die an vielen Standorten gekauft und verkauft werden).

price 
quantity 
type 
buyflag 
location 

‚buyflag‘ ist boolean und repräsentiert, ob die aufgezeichnete Preis ist der Preis, den Punkt an gekauft oder verkauft wird, wo buyflag = true ist der Preis ein Artikel für und buyflag gekauft = false a zeigt Preis, zu dem das Produkt verkauft wurde.

Ich möchte ein Abfrageergebnis, das zwei Standorte nach jedem Produkttyp vergleicht, wenn der Artikel am ersten Standort gekauft und am zweiten Standort verkauft wird. Mit anderen Worten, sieht etwa so aus:

type | quantity | 'buyprice' | 'sellprice' 

wo ‚buyprice‘ ist der Preis, den sie an der Position 1 und ‚sellprice‘ ist der Preis, den sie an der Stelle verkauft 2.

Nach einigen Recherchen gekauft wurde Ich war in der Lage, Joins und Unterabfragen zu verwenden, um andere Ergebnisse anzuzeigen, bin aber in diesem Fall davon ausgeschlossen, nach den letzten beiden Spalten in dieser bestimmten Abfrage zu suchen, wenn die Daten alle in einer einzigen Tabelle sind, aber zwei WHERE-Anweisungen erfordern Grabe es aus.

select type, quantity, max(price) as buyprice 
from marketfile 
where (buyflag=true and location=102) 
group by type; 

die ersten 3 Spalten erhalten, oder

select type, quantity, min(price) as sellprice 
from marketfile 
where (buyflag=false and location=75) 
group by type; 

wird die erste, zweite und vierte Spalte bekommen, aber ich kann nicht herausfinden, wie sie alle in der einer Abfrage zu erhalten.

Mein eher schlecht subquery Aufwand (nicht) so weit war:

select type, quantity, min(price) as buyprice, 
(select max(price) from marketfile where (buyflag=false and location=75)) as sellprice 
from marketfile 
where (buyflag=true and location=102) 
group by type; 

Der Grund, warum ich es in einer einzigen Abfrage möchte ist dann PHP zu verwenden, um die Abfrage als eine Tabelle angezeigt werden, so kann ich sehen auf der Liste der hunderten von Artikeln, die an Standort 1 gekauft und an Standort 2 verkauft werden, und die Ränder auf dieser bestimmten Route nach Produkt betrachten.

Ich bin versucht, meine MySQL-Unzulänglichkeiten zu umgehen, indem Sie die zwei separaten Abfragen wie oben verwenden und sie in eine neue Tabelle ablegen und dann diese Tabelle erneut abfragen. Diese Problemumgehung scheint nicht besonders elegant zu sein, wenn ich dann mit vielen Standorten arbeiten möchte und daher exponentiell steigende Anzahl von Routen (und damit Tabellen zum Arbeiten).

Vielen Dank im Voraus für jede Hilfe.

+0

Wenn Sie Ihren Abfragen Code-Tags hinzufügen (der kleine Button mit '101 010'), wird Ihre Frage viel lesbarer. – LittleBobbyTables

+0

Danke LittleBobbyTables – lillebusy

Antwort

0

Wenn ich richtig verstehe, möchten Sie zwei Zeilen aus der Tabelle Marktdatei in eine Ausgabezeile kombinieren. Um dies zu erreichen, müssen Sie den Tisch mit sich selbst verbinden. Sie können es tun, indem sie zweimal in der FROM-Klausel setzen und geben es Aliases:

SELECT a.type, … 
FROM marketfile as a, marketfile as b 
WHERE (a.type = b.type) AND (a.location = 102) AND (b.location = 75) AND … 

Stellen Sie sicher, alle setzen die notwendigen Bedingungen in der WHERE-Klausel kommen nur entsprechende Datensätze auszuwählen. Andernfalls dauert die Abfrage für immer und viel zu viele Ergebnisse zurück.

+0

Vielen Dank travelboy.Die Antwort, die du zur Verfügung gestellt hast, war genau das, was ich brauchte. Mir war nicht bewusst, dass ich Aliase für die Tabelle verwenden konnte, um die Tabelle mit sich selbst zu verknüpfen und dann für jeden Alias ​​verschiedene WHERE-Einschränkungen anzugeben. Die Aufnahme dieser Information in meine Abfrage scheint direkt aus dem Fenster gelaufen zu sein. Es ist mir noch nicht erlaubt, meinen Ruf wegen meiner Neuheit zu verbessern, aber hoffentlich wird es jemand anderes für mich tun, bis ich dazu in der Lage bin. – lillebusy

+0

Für diejenigen, die davon profitieren könnten, die resultierende Abfrage basierend auf travelboy Antwort sah aus wie die folgenden – lillebusy

+0

Ich bin froh, es hat funktioniert! Ich erinnere mich, dass ich vor Jahren die gleiche Herausforderung hatte, für immer gesucht habe und schließlich war ich überrascht, dass die Lösung so einfach war :-) Ich bin auch neu hier. Ich denke, _accepting_ eine Antwort (nicht upping) erfordert keine minimale Reputation – travelboy

Verwandte Themen