php-resource



Zurück   PHP-Scripte PHP-Tutorials PHP-Jobs und vieles mehr > Entwicklung > SQL / Datenbanken
 

Login

 
eingeloggt bleiben
star Jetzt registrieren   star Passwort vergessen
 

 

 


SQL / Datenbanken Probleme mit SQL? Hier könnt ihr eure Fragen zu SQL (MySQL, PostgreSQL, MS-SQL und andere ANSI-SQL Server) los werden.

Antwort
 
LinkBack Themen-Optionen Thema bewerten
  #1 (permalink)  
Alt 22-05-2007, 15:34
sp00n
 Newbie
Links : Onlinestatus : sp00n ist offline
Registriert seit: Jul 2004
Beiträge: 28
sp00n ist zur Zeit noch ein unbeschriebenes Blatt
Question [MySQL] SUM über verschiedene Spalten

Hallo zusammen. Nach langer Zeit melde ich mich mal wieder hier, bisher hat mir immer Lesen und Suchen zur Problemlösung ausgereicht, diesemal komme ich jedoch irgendwie nicht weiter. Kurz gesagt: ich steh aufm Schlauch.

Also folgendes, ich habe 3 Tabellen:

Tabelle 1: Bausteine
In dieser steht der Name und ein Code eines Bausteins (natürlich noch mehr, aber für das Beispiel reichen diese beiden).

Tabelle 2: Komponenten
In dieser Tabelle steht der Name, Code und 3 Zeitwerte der Komponenten, aus denen ein Baustein bestehen kann (zeit1, zeit2, zeit3).

Tabelle 3: Zuordnung
In dieser Tabelle steht nun eine Referenz zu Bausteine.code, Komponenten.code und Komponenten.zeitwert (in Form von einfach 1, 2 oder 3).


Bausteine enthält also die übergeordneten Bausteine, Komponenten die Bestandteile derselben und Zuordnung die jeweilige, ja, Zuordnung der Komponenten zu den Bausteinen.

Nun möchte ich eine SQL-Abfrage schreiben, die mir a) den Namen und Code der Bausteine ausgibt (einfach) und b) den jeweiligen Zeitwert aus den Komponenten summiert. Das Problem dabei ist, dass ich ja nicht nur eine Spalte mit den Zeitwerten habe, sondern deren drei.

Ich bräuchte also eine Abfrage, die sozusagen "dynamisch" den Spaltennamen anpasst, je nachdem welche Zahl in der Tabelle Zuordnung angegeben wurde.


Folgendes Beispiel:
Tabelle Bausteine enthält folgende Daten:
Code:
code   name
AB01   Testbaustein 1
AB02   Testbaustein 2
Tabelle Komponenten:
Code:
code    name   zeit1   zeit2   zeit3
0001     Tun      10      20      30
0002  Machen      25      35      45
0003  Ebenso      45      60      75
0009   Blubb       5       6       7
Tabelle Zuordnung:
Code:
baust_code   komp_code   komp_zeit
      AB01        0001           1
      AB01        0003           3
      AB01        0009           2
      AB01        0002           1
      AB02        0003           2
      AB02        0002           3
Nun müsste ich also von Komponenten den Wert "zeit1" von 0001 addieren mit "zeit3" von 0003, "zeit2" von 0009 und "zeit1" von 0009.

Und da fängt mein Problem an. Eventuell ist auch die Datenbankstruktur nicht optimal und man könnte es besser lösen. Bis zu diesem Problem fand ich sie jedoch ganz brauchbar, aber da habe ich mal wieder nicht weit genug gedacht.

Für ein JOIN/SUM() Statement bräuchte ich ja immer den jeweiligen Namen der Tabellenspalte, bzw. würde das überhaupt gehen, wenn verschiedene Spalten angesprochen werden müssen?

Theoretisch könnte ich den Zeitwert von zeit1 etc. auch in komp_zeit schreiben lassen, allerdings hätte ich dann eine Redundanz, die ich vermeiden will (wenn sich beispielsweise der Zeitwert einer Komponente ändert, müsste dies auch in der Tabelle Zuordnung dann nochmals eingetragen werden).


Falls die Datenbankstruktur kompletter Unsinn ist, würde ich mich auch über Verbesserungsvorschläge freuen. Ist ja noch kein gewachsenes Projekt sondern gerade in der Entwicklung.


Hilfe.

Geändert von sp00n (22-05-2007 um 15:41 Uhr)
Mit Zitat antworten
  #2 (permalink)  
Alt 22-05-2007, 16:45
sp00n
 Newbie
Links : Onlinestatus : sp00n ist offline
Registriert seit: Jul 2004
Beiträge: 28
sp00n ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Hmm, einen Viertelschritt weiter gekommen.
Mit CONCAT('bausteine.zeit', zuordnung.komp_zeit) könnte ich zumindest den Spaltennamen zusammensetzen lassen.

Nur zugreifen müsste ich jetzt noch auf den generierten Spaltennamen können. Das wäre dann ein halber Schritt. *g*
Mit Zitat antworten
  #3 (permalink)  
Alt 22-05-2007, 17:45
highrise
 Member
Links : Onlinestatus : highrise ist offline
Registriert seit: Apr 2006
Ort: zu Hause *g*
Beiträge: 257
highrise ist zur Zeit noch ein unbeschriebenes Blatt
Standard

das ist jetzt n bissi finster... und auf den ersten blick glaube ich, kommst du um eine subquery nicht herum...

ich bin nicht sicher, ob mysql abfragen über "dynamische" spaltennamen beherrscht...

um das problem zu umgehen, könnte man die werte zeit1 zeit2 und zeit3 in einer weiteren tabelle aufbewahren... ich hab das nicht ganz durchgespielt.... so dass dann felder comp_index zeit_index zeit_wert darin existieren. und in komponenten hält man nicht mehr die zeit, sondern nur noch eine referenz auf die zeit....

dann kannst du mit deiner zuordnungstabelle alles genau so zusammenbauen, wie du es brauchst...

means, du joinst jeweils auf die einzelnen tables unter der bedingung, dass komp_code auch in beiden joined-tables übereinstimmt...

dann müsste ein SUM möglich sein über die ergebnisspalte...

nur ein denkansatz... hoffentlich bringts dich weiter...

greetz, high
__________________
Good programming is 40% experience, 20% skill, 20% RTFM, 15% caffeine, and 5% attention to detail.
When everything else fails, manipulate the data...
Beschriftungen / Großformatdruck / Werbemittel
Mit Zitat antworten
  #4 (permalink)  
Alt 26-05-2007, 06:27
kratzbaum
 Newbie
Links : Onlinestatus : kratzbaum ist offline
Registriert seit: May 2007
Ort: Essen
Beiträge: 13
kratzbaum ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Günstiger ist wohl, die zeiten zeit1 bis zeit3 in ein einziges Attribut zu stecken und ein weiteres Attribut, das den Typ angibt.

Tabelle Komponenten:

code, name zeit, zeittyp

Nachteil: mehr Datensätze (für jeden Zeittyp einen)

Vorteil: Flexibiltät, einfachere Summierung (SUM ..., GROUP BY ...),
dynamisch (wenn weitere Zeittypen hinzukommen, braucht man wder PHP-Code noch DB-Modell zu ändern )
__________________
Her mittie Abbeit!
Mit Zitat antworten
  #5 (permalink)  
Alt 30-05-2007, 13:51
sp00n
 Newbie
Links : Onlinestatus : sp00n ist offline
Registriert seit: Jul 2004
Beiträge: 28
sp00n ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Zitat:
Günstiger ist wohl, die zeiten zeit1 bis zeit3 in ein einziges Attribut zu stecken und ein weiteres Attribut, das den Typ angibt.
Das habe ich jetzt nicht ganz verstanden. Was meinst du mit Attribut?
Bzw. wie sähe dann die Tabellenstruktur aus?
Mit Zitat antworten
  #6 (permalink)  
Alt 30-05-2007, 21:01
kratzbaum
 Newbie
Links : Onlinestatus : kratzbaum ist offline
Registriert seit: May 2007
Ort: Essen
Beiträge: 13
kratzbaum ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Tabelle 2: Komponenten

code
id_zeittyp
zeit

Tabelle zeittyp:
id_zeittyp
name

Tabellen sind über id_zeittyp verknüpft.

Wenn jetzt ein weiterer Zeittyp hinzukommt: Kein Problem.
Bei deiner Lösung musst du die Datenbankstruktur ändern
(z.B für zeit4, zeit5 ...)

code, id_zeittyp, name usw nennt man Attribute.
__________________
Her mittie Abbeit!
Mit Zitat antworten
  #7 (permalink)  
Alt 21-10-2015, 13:25
LlvS
 Registrierter Benutzer
Links : Onlinestatus : LlvS ist offline
Registriert seit: Oct 2015
Beiträge: 7
LlvS befindet sich auf einem aufstrebenden Ast
Standard

Wie wäre es mit diesem Ansatz:

PHP-Code:
SELECT `b`.`code`, 
    (IF(`
z`.`Zuordnung` = '1'SUM(`k`.`zeit1`), 0) + IF(`z`.`Zuordnung` = '2'SUM(`k`.`zeit2`), 0) + IF(`z`.`Zuordnung` = '3'SUM(`k`.`zeit3`), 0)) AS `zeit`
FROM `Bausteine` AS `b`, ... 
Mit Zitat antworten
Antwort

Lesezeichen


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 

Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an


PHP News

ebiz-trader 7.5.0 mit PHP7 Unterstützung veröffentlicht
ebiz-trader 7.5.0 mit PHP7 Unterstützung veröffentlichtDie bekannte Marktplatzsoftware ebiz-trader ist in der Version 7.5.0 veröffentlicht worden.

28.05.2018 | Berni

Wissensbestand in Unternehmen
Wissensbestand in UnternehmenLebenslanges Lernen und Weiterbilden sichert Wissensbestand in Unternehmen

25.05.2018 | Berni


 

Aktuelle PHP Scripte

ebiz-trader 6.0 - Das professionelle PHP Marktplatz Script ansehen ebiz-trader 6.0 - Das professionelle PHP Marktplatz Script

Mit unserer Lösungen können Sie nahezu jeden B2B / B2C Marktplatz betreiben den Sie sich vorstellen können. Ganz egal ob Sie einen Automarktplatz, Immobilenportal oder einfach einen Anzeigenmarkt betreiben möchten. Mit ebiz-trader können Sie Ihre Anforder

11.10.2018 Berni | Kategorie: PHP/ Anzeigenmarkt
PHP Server Monitor

PHP Server Monitor ist ein Skript, das prüft, ob Ihre Websites und Server betriebsbereit sind.

11.09.2018 Berni | Kategorie: PHP/ Security
PHP WEB STATISTIK ansehen PHP WEB STATISTIK

Die PHP Web Statistik bietet Ihnen ein einfach zu konfigurierendes Script zur Aufzeichnung und grafischen und textuellen Auswertung der Besuchern Ihrer Webseite. Folgende zeitlichen Module sind verfügbar: Jahr, Monat, Tag, Wochentag, Stunde Folgende son

28.08.2018 phpwebstat | Kategorie: PHP/ Counter
 Alle PHP Scripte anzeigen

Alle Zeitangaben in WEZ +2. Es ist jetzt 22:52 Uhr.