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
freelancermap.de - IT Projektvermittlung für Selbständige und Freiberufler
  #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
 Registrierter Benutzer
Links : Onlinestatus : highrise ist offline
Registriert seit: Apr 2006
Ort: zu Hause *g*
Beiträge: 264
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

PHP Marktplatz-Software
PHP Marktplatz-SoftwareEs hat sich viel getan! Die neue Version 7.5.9 unserer PHP Marktplatz-Software ebiz-trader steht ab sofort zur Verfügung.

28.10.2019 | Berni

Die RIGID-FLEX-Technologie
Die RIGID-FLEX-TechnologieDie sogenannte "Flexible Elektronik" , oftmals auch als "Flexible Schaltungen" bezeichnet, ist eine zeitgemäße Technologie zum Montieren von elektronischen Schaltungen.

06.12.2018 | Berni


 

Aktuelle PHP Scripte

SMT

Server Monitoring & Management Tool Das SMT wurde von einem Administrator für Administratoren entwickelt, es vereinfacht den Alltag in der klassischen Administration und Verwaltung. Mit dem SMT kannst Du alle Deine Server & Dienste verwalten und überwach

04.09.2020 palle_1977 | Kategorie: PHP
numaeks Web-Farbmixer

Die RGB-Farben lassen sich hier auf unterschiedliche Weise mischen. Zur Einstellung werden auch die Dreh- und Schieberegler mit Canvas verwendet. Gespeichert werden die Farben in einem Cookie.

04.09.2020 numaek | Kategorie: JAVASCRIPT/ Tools
phplinX-Erotikportal 4 ansehen phplinX-Erotikportal 4

Erweiterbares Portal speziell für Erotik mit den Modulen Webkatalog, Bannermanagement und Kleinanzeigenmarkt. Sämtliche Module können über einen einzigen Adminbereich verwaltet werden.

18.06.2020 Cosinus14 | Kategorie: PHP/ Anzeigenmarkt
 Alle PHP Scripte anzeigen

Alle Zeitangaben in WEZ +2. Es ist jetzt 10:30 Uhr.