Zwei Spalten einer Tabelle, getrennt für sich, Zeile für Zeile vergleichen.

Kaffee

Benutzer
Beiträge
6
Hallo liebes Forum,

ich beschäftige mich seit neusten mit MySQL (Version 14.14) und versuche gerade folgendes umzusetzen.

Tabelle: tab1
Zeilen: produkt preis größe
p1 2.00 30
p2 1,40 24
p3 5,20 30
p4 1,40 24

Bei solch einer Tabelle zwei Spalten, in diesem Fall 'preis' und 'größe' Zeile für Zeile vergleichen. Das Ausgangsprodukt sollte dabei nicht mit ausgegeben werden. Es können auch mehrere Produkte mit gleichem preis und Größe auftauchen.

Hier sollte raus kommen 'p4 1,40 24'.

Meine aktuelle Idee sieht folgendermaßen aus:

tab1 as tab2 SELECT* FROM tab1 WHERE tab1.preis = tab2.preis AND tab1.größe = tab2.größe;

Danke und schöne Grüße

Kaffee
 
Werbung:
Code:
andreas@[local]:5434/test# select * from kaffee ;
 produkt | preis | groesse
---------+-------+---------
 p1      |     2 |      30
 p2      |   1.4 |      24
 p3      |   5.2 |      30
 p4      |   1.4 |      24
(4 rows)

andreas@[local]:5434/test# select max(produkt) as produkt, preis, groesse from kaffee group by preis, groesse having count(1) > 1;
 produkt | preis | groesse
---------+-------+---------
 p4      |   1.4 |      24
(1 row)

andreas@[local]:5434/test#
 
Code:
andreas@[local]:5434/test# select * from kaffee ;
 produkt | preis | groesse
---------+-------+---------
 p1      |     2 |      30
 p2      |   1.4 |      24
 p3      |   5.2 |      30
 p4      |   1.4 |      24
(4 rows)

andreas@[local]:5434/test# select max(produkt) as produkt, preis, groesse from kaffee group by preis, groesse having count(1) > 1;
 produkt | preis | groesse
---------+-------+---------
 p4      |   1.4 |      24
(1 row)

andreas@[local]:5434/test#


Angenommen ich habe mehr Spalten z.B. noch Herstellungsland, Firma..., um diese dann mit ausgeben zu lassen müssen diese auch mit in GROUP BY angegeben werden, allerdings will ich weiterhin nach preis und groesse vergleichen. Wie kann ich das dann umsetzten?
 
alle Spalten im Resultat müssen aggregiert oder gruppiert sein. Was soll den angezeigt werden für Land oder Firma? Die Frage stellte sich vorhin auch schon, ich habe max(produkt) genommen, das kannst Du so auch für weitere Spalten machen. Über den inhaltlichen "Wert" mußt Du Dir klar werden...
 
alle Spalten im Resultat müssen aggregiert oder gruppiert sein. Was soll den angezeigt werden für Land oder Firma? Die Frage stellte sich vorhin auch schon, ich habe max(produkt) genommen, das kannst Du so auch für weitere Spalten machen. Über den inhaltlichen "Wert" mußt Du Dir klar werden...

Könntest du mir kurz erklären warum alles Spalten aggregiert oder gruppiert werden müssen?
 
stell dir vor, du hast:

Code:
andreas@[local]:5434/test# select * from demo;
 id | val
----+-----
 a  |   5
 b  |  10
(2 rows)

und suchst das avg(val):

Code:
andreas@[local]:5434/test# select avg(val) from demo;
        avg         
--------------------
 7.5000000000000000
(1 row)

Das ist logisch und korrekt, oder?

Du willst aber auch noch dazu die ID-Spalte angezeigt haben. Frage: 'a' oder 'b'? Was ist richtig?

Code:
andreas@[local]:5434/test# select id, avg(val) from demo ;
ERROR:  column "demo.id" must appear in the GROUP BY clause or be used in an aggregate function
LINE 1: select id, avg(val) from demo ;
               ^
andreas@[local]:5434/test#

Die Tatsache, daß MySQL sowas zuläßt und irgend ein Wert für ID anzeigt ist kein Hinweis darauf, daß es logisch korrekt ist.
 
Sorry für die späte Antwort!

In diesem Kontext würde ich sagen die Gruppierung aus 'a' und 'b'!?

In Land und Firma würden Strings drin stehen und da es auch mehrere sein könnten verstehe ich nicht ganz warum du mit max() arbeitest?
 
In Land und Firma würden Strings drin stehen und da es auch mehrere sein könnten verstehe ich nicht ganz warum du mit max() arbeitest?

min() und max() kann man auf Strings anwenden, avg() leider nicht ;-)

irgend ein Wert muß ja dargestellt werden, nur welcher? MySQL nimmt einen zufälligen (der morgen zufällig ein anderer sein kann), was ist das denn bitte? Ob min() oder max() aus einem String Sinn ergibt ist dahingestellt...
 
Okay, muss mich wohl noch bisschen mehr mit Aggregationen beschäftigen.

Angenommen ich würde in meinem Bsp. die zwei niedrigsten Preise raus finden wollen, kann ich min() dann so einsetzten:

SELECT * FROM tab1 WHERE MIN(preis) COUNT (0) < 3;
 
Ich habe es natürlich Probiert;). Durch die Fehlermeldung wusste ich nicht ob ich überhaupt mit min() und count() arbeiten darf.

Der Befehl limit ist mir neu, aber sehr Hilfreich. Musste allerdings das DESC in ASC umwandeln damit es klappt:)

Danke!
 
Werbung:
Zurück
Oben