[MySQL] Werte zusammenfassen

rony12

Commodore
Registriert
Jan. 2007
Beiträge
4.940
Hallo,

ich bin in einem kleinem Verein.... Wie haben ein paar Flyer und sonstiges Werbematerial...

Ich wollte eine kleine Online-Inventardatenbank dafür aufbauen...

Nun ist es so, dass unterschiedliche Leute, eine unterschiedliche Anzahl von den gleichen Flyern haben. Deswegen speichere ich unter der selben Bezeichnung und unter dem selben Typ aber unter einem anderen Ort das Material.


meine Tabelle sieht so aus:

ID | bezeichnung | typ | ort | anzahl | wert


Wenn ich nun danach suche, dann möchte die Datensätze so aufgeführt haben, dass wenn Bezeichnung und Typ gleich sind, diese zusammengefasst werden.... die INT werte aus anzahl und die Doublewerte aus wert sollen zusammengefasst werden.

Ich habe da auch schon etwas hinbekommen....

PHP:
SELECT `bezeichnung`, `typ`, `ort`, SUM(anzahl) AS sum_anzahl, SUM(wert) AS sum_wert  FROM `data` GROUP BY `bezeichnung`

Nun werden alle Datensätze mit der selben Bezeichnung zusammengefasst - sollte jedoch ein Datensatz einen Anderen Typ haben, wird es auch darunter eingefasst...
Sollte nicht sein, man kann ja zu einem thema eine Broschüre und einen Flyer haben :)

Der Trick wird also bei dem "GROUP BY" liegen :)


War das verständlich was mein Anliegen ist ^^?
 
Bring deine Daten erst einmal in eine normierte Form. Halte dich dabei an den guten alten Leitsatz:
The key, the whole key and nothing but the key. So help me Codd!

Das sollte dir deine Selects deutlich vereinfachen.
 
Du meinst also, Ort und Typ in eine extra Tabelle zu packen?
 
Wie wärs mit:

Code
PHP:
:

    SELECT `bezeichnung`, `typ`, `ort`, SUM(anzahl) AS sum_anzahl, SUM(wert) AS sum_wert FROM `data` GROUP BY `bezeichnung`, `typ`

Ich habs nicht ausprobiert...
 
die Lösung von udo1980 funktioniert soweit ich das jetzt probiert habe :)

Ich habe das in eine Suche eingebaut....

Hier mal mein Query...

PHP:
$SQL = "SELECT  `bezeichnung` ,  `typ` ,  `ort` , SUM( anzahl ) AS sum_anzahl, SUM( wert ) AS sum_wert FROM  `data` WHERE `bezeichnung` LIKE '%".$_POST["suchbegriff"]."%' OR `typ` LIKE '%".$_POST["suchbegriff"]."%' OR `ort` LIKE '%".$_POST["suchbegriff"]."%' GROUP BY  `bezeichnung` ,  `typ`";
 
Hi mal zur Normalisierung: Ich würde spontan das ganze in 4 Tabellen aufteilen.

#Tabelle 1
ID(PK)|Typ(FK)|Bezeichnung(FK)|Ort(FK)|Anzahl|Wert (sollte der Wert sich nach dem Typen richten, so würde ich den Wert zum Typ ausgliedern)

#Tabelle 2
idOrt|Ort

#Tabelle 3
idBezeichnung|Bezeichnung

#Tabelle 4
idTyp|Typ

-> Redundanzen sollten dadurch vermieden werden. Ich habe das nach deine Formulierung jetzt so verstanden:
Der Ort Berlin(Ort) hat 222(Anzahl) Werbeflyer(Typ) mit der Bezeichnung XY mit einem Gesamtwert/Einzelwert von 3,5 €(Wert).

Empfehlen würde ich dann einen Join über mehrere Tabellen und ein Group by geht natürlich über mehrere Attribute. Das ganze dann noch mit referentieller Integrität (die Engine InnoDB kann dies)
und du solltest alles haben, was deine Ansprüche betrifft.
Ergänzung ()

Man kann das auch anders verstehen.
Es war bestimmt so gedacht, dass du eine Auflistung machen wolltest, welche Person welche Materialien hat.
Jedes Material hat einen bestimmten Wert. Dementsprechend würde ich die Tabellen ändern und zwar wie folgt:

#Tabelle 1
id_Person(PK)|idPLZ(FK)
-> Unter dem Ort verstehe ich den Wohnort. Falls dies so sein sollte würde ich noch extra Felder für die Straßenamen, Vorname etc. hinzufügen

#Tabelle 2
idPLZ(PK)|idOrt(FK)

-> Manche Orte haben mehrere PLZ.

#Tabelle 3
idOrt(PK)|Ort

-> Zur Vermeidung von Redundanzen.

#Tabelle 3
idBezeichnung(PK)|Bezeichnung

-> Jedes Inventar hat eine Bezeichnung

#Tabelle 4
idTyp(PK)|Typ |Wert

-> Jedes Inventar hat einen Typ und wahrscheinlich auch einen Einzelwert/Preis

#Tabelle 5
idPerson(PK)|idTyp(PK)|idBezeichnung(PK)| Anzahl


-> Eine mögliche Formulierung wäre dann:
Herr Mustermann(idPErson) hat 222(Anzahl) Werbeflyer(Typ) mit der Bezeichnung "XY"
 
Der ort ist der name einer Person, bzw. jegliche Art von Bezeichnung für einen Ort...

Das mit der Normalisierung ist eine gute sache... sah aber keinen riesen grund dafür... ich habe das bei der eingabe so gemacht, dass vorhandene eingaben vorgeschlagen werden - aber ist schon wahr - bissel normalisiert sollte da schon sein^^
 
ok das war dann etwas irreführend mit dem ort als Name einer Person xD Dann kannst du dir aus der Tabelle 1 den FK löschen, sowie die Tabellen 2 und 3 vergessen. Ich würde die Tabelle 1 dann aber trotzdem sogestalten, dass du den Namen nicht als PK benutzt, weil der ja öfters auftauchen könnte. Die Tabelle 1 sollte dann zumindest so aussehen:

idPerson(PK)|Vorname|Nachname
 
Zurück
Oben