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 07-06-2007, 12:58
Gregor_Jelt
 Newbie
Links : Onlinestatus : Gregor_Jelt ist offline
Registriert seit: Jun 2007
Beiträge: 10
Gregor_Jelt ist zur Zeit noch ein unbeschriebenes Blatt
Standard Sporttabelle

Schönen Tag !

Erstmal ein herzliches Hallo an alle, bin neu hier und hoffe, dass ich
euch nicht allzu viel eurer Zeit berauben werde mit meinen Fragen !

Ich bin aktuell dabei mir mit Hilfe von PHP und MySQL eine Sporttabelle
anhand von Spielergebnissen aus der MySQL Tabelle ausgeben zu
lassen, doch der MySQL-Bereich bereitet mir da leider noch recht große
Schwierigkeiten.

Zunächst einmal mein Datenbankaufbau:
ID - TeamH - TeamA - ToreH - ToreA
H = Heim & A = Auswärts nur für das Verständnis ... hab natürlich
auch noch weitere Spalten wie Datum etc., aber für den grundlegenden
Aufbau der Tabelle ja völlig irrelevant.

Nun habe ich also beispielsweise zwei Enträge
1 - Buschhausen - Buxtehude - 2 - 0
2 - Buschhausen - Karlsruhe - 0 - 5

Code:
Select ID, TeamH, TeamA, ToreH, ToreA
Sum(IF (Ergebnis.ToreH > Ergebnis.ToreA, 3, 0)) as Punkte
Sum(IF (Ergebnis.ToreH = Ergebnis.ToreA, 1, 1)) as Punkte
Sum(IF (Ergebnis.ToreH < Ergebnis.ToreA, 0, 3)) as Punkte
From Ergebnis Group by Team(?) Order by Punkte
Ich habe jetzt bewusst die MySQL Syntax außen vor gelassen, da
ich zunächst mal zeigen wollte was ich bisher prinzipiell machen will.
Nur jetzt weiß ich leider auch nicht weiter, wie ich das MySQL-mäßig
so mache, damit ich nachher auch wirklich die Tabelle rausbekomme,
denn so habe ich ja "Team(?)", dass es ja z.B. gar nicht gibt.

Also ihr seht mir fehlt da leider noch viel das Verständnis für den
Umgang mit "weiterführendem" MySQL, denn bisher hab ich nur
Standard-Abfragen für Statistiken, News etc. durchgeführt, aber mit
diesen Mitteln komme ich hier leider nicht weiter und das Arbeiten
mit SubSelects, Self-Joins oder Union (Falls man davon was braucht,
wovon ich ausgehe).

Naja, würde mich jedenfalls sehr freuen wenn mir jemand dabei
helfen könnte, wie ich diese MySQL Abfrage gestalten muss, denn
bisher steh ich ehrlich gesagt auf dem Schlauch ...

Ich wünsche euch noch einen schönen Feiertag und schonmal
Vielen Dank für jeden Beitrag!
Mit Zitat antworten
  #2 (permalink)  
Alt 08-06-2007, 02:53
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

die struktur deiner tabelle ist etwas unpraktisch gewählt

an deiner stelle würde ich spielpaare splitten, so dass du in der datenbank in deinem beispiel folgendes hättest:

spiel - team - tore - heim
1 - Buschhausen - 2 - 1
1 - Buxtehude - 0 - 0
2 - Buschhausen - 0 - 1
2 - Karlsruhe - 5 - 0


darauf aufbauend sollte sich die abfrage wesentlich leichter gestalten lassen...

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
  #3 (permalink)  
Alt 09-06-2007, 06:50
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

Du willst sicher nicht nur die Tabelle einer Saison verarbeiten, sondern mehrere Spielzeiten.
Ausserdem möchtest du bestimmt die Tabelle jedes Spieltags haben.
Weiterhin gibt es mehrere Ligen usw usw.

Deine (MYSQL)-Tabelle könnte so aussehen
Code:
id_liga         PK
id_saison    PK
spieltag       PK
spielnr        PK
id_heim      FK
id_gast       FK
tore_heim
tore_gast
Die Attribute, die mit "id" beginnen, verweisen auf andere Tabellen.
PK = Primary Key. FK = Foreign Key.

Punkte werden berechnet - gehören also nicht in die Datenbank.

Deine Berechnung läuft dann wie folgt:
Du holst dir die Datensätze einzeln aus der Datenbank und berechnest Torverhältnis und Punkte jeder Mannschaft.
__________________
Her mittie Abbeit!
Mit Zitat antworten
  #4 (permalink)  
Alt 09-06-2007, 09:26
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

@kratzbaum

und schon hat er in deiner tabelle wieder das selbe Logik-Problem wie zuvor auch... TEAM mus eindeutig sein... basta... und net team_heim team_gast... sonst hast du wieder das selbe problem in der ORDER BY klausel...

die punkte gehören natürlich nicht in die tabelle... sind sie ja auch nie vorgesehen gewesen, aber die werden bereits während der abfrage berechnet, weils schneller geht, als den ganzen simsch hinterher in PHP nochmal zu durchlaufen und da ggf. dann auch noch den parser mit variablen variablen zu quälen...

dass die tables noch durch weitere angaben ergänzt werden können, versteht sich von selbst...

insofern... erst lesen, dann denken, dann posten...

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
  #5 (permalink)  
Alt 09-06-2007, 23:56
Gregor_Jelt
 Newbie
Links : Onlinestatus : Gregor_Jelt ist offline
Registriert seit: Jun 2007
Beiträge: 10
Gregor_Jelt ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Danke für die Hilfe schonmal, ich glaub soweit hab ich schon
einen guten Ansatz dafür !

Desweiteren würd ich allerdings noch eine Frage stellen,
wenn ich darf: Hab mich nämlich währenddessen mit etwas
anderes beschäftigt, da ich ja hier nicht weiterkam ...

Code:
SUM(
If(x.TeamID = y.ID AND x.LeagueID = 1, If(x.HGoals > x.AGoals, 10,
If(x.HGoals < x.AGoals, 3, 7)))) as Wertung
Ich erhalte an dieser Stelle einen Syntax Fehler in einem MySQL
Statement ... der Rest funktioniert (hab mal diesen Teil rausgenommen
und nur den Rest laufen lassen - läuft prima)

Wisst ihr vielleicht welchen Syntaxverstoß ich hier erzwungen habe?
Der Fehler ist übrigens Nummer 1064.

Schonmal lieben Dank und einen schönen Sonntag!
Mit Zitat antworten
  #6 (permalink)  
Alt 10-06-2007, 06:28
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

ich bin nicht sicher...

würde aber tippen: bei dem ersten if fehlt das alternativergebnis...

ansonsten kann ich nichts entdecken...
__________________
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

Geändert von highrise (10-06-2007 um 06:31 Uhr)
Mit Zitat antworten
  #7 (permalink)  
Alt 10-06-2007, 11:23
Gregor_Jelt
 Newbie
Links : Onlinestatus : Gregor_Jelt ist offline
Registriert seit: Jun 2007
Beiträge: 10
Gregor_Jelt ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Code:
SUM(
// Wenn das Team aus der SpieleDB mit dem Team aus der VereinsDB
übereinstimmt und es sich um die Liga mit der ID 1 handelt
If(x.TeamID = y.ID AND x.LeagueID = 1, 

// Wenn Heimteam mehr Tore geschossen hat, erhalten sie 10 Wertungspunkte
If(x.HGoals > x.AGoals, 10,

// Wenn Heimteam weniger Tore geschossen hat, erhalten sie nur 3 Wertungspunkte
If(x.HGoals < x.AGoals, 3,

// Ansonsten (Unentschieden-Fall) gibt es sieben Punkte
 7)))) as Wertung
Ist die letzte 7 dann nicht so ein Alternativereignis für das If?
Mit Zitat antworten
  #8 (permalink)  
Alt 10-06-2007, 11:43
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

if erwartet drei diskrete statements...

für das zweite und das dritte if ist das gegeben if (bedingung, statement falls true, statement falls false)

die 7 gehört zum dritten if

die logik ist okay, soweit, aber es existiert kein statement für den fall


x.TeamID = y.ID AND x.LeagueID = 1 == false

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
  #9 (permalink)  
Alt 10-06-2007, 11:51
Gregor_Jelt
 Newbie
Links : Onlinestatus : Gregor_Jelt ist offline
Registriert seit: Jun 2007
Beiträge: 10
Gregor_Jelt ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Hmm, ich dachte dies wäre egal, also wenn die If-Bedingung nicht
erfüllt ist und es kein anderes Statement gibt, dass dann einfach nichts
passiert ....

Was würdest du mir denn vorschlagen da noch inwiefern hinzuzufügen?
Kann ja auch nur ein BeispielStatement sein nur um zu schauen ob
es überhaupt daran liegt ...
Mit Zitat antworten
  #10 (permalink)  
Alt 10-06-2007, 11:54
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

probier mal einfach so:

SUM(
If(x.TeamID = y.ID AND x.LeagueID = 1, If(x.HGoals > x.AGoals, 10,
If(x.HGoals < x.AGoals, 3, 7)),0)) as Wertung

means, wenn die initialbedingung vom ersten if nicht erfüllt ist, dann 0 Punkte

alternativ könntest du das erste if weglassen und stattdessen das ganze in eine WHERE klausel packen.. also in der art:

SUM(
If(x.HGoals > x.AGoals, 10,
If(x.HGoals < x.AGoals, 3, 7))) as Wertung WHERE x.TeamID = y.ID AND x.LeagueID = 1

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

Geändert von highrise (10-06-2007 um 11:57 Uhr)
Mit Zitat antworten
  #11 (permalink)  
Alt 10-06-2007, 12:09
Gregor_Jelt
 Newbie
Links : Onlinestatus : Gregor_Jelt ist offline
Registriert seit: Jun 2007
Beiträge: 10
Gregor_Jelt ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Ersteres funktioniert perfekt Lag also doch wie du sagtest daran,
dass das erste If Statement wissen muss, was es machen soll, wenn
es False ist - Vielen Dank !
Mit Zitat antworten
  #12 (permalink)  
Alt 10-06-2007, 15:38
Gregor_Jelt
 Newbie
Links : Onlinestatus : Gregor_Jelt ist offline
Registriert seit: Jun 2007
Beiträge: 10
Gregor_Jelt ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Hallo nochmal und entschuldigt bitte die Störung, aber ich wollte
noch eine Kleinigkeit bezüglich MySQL nachfragen ... ist es möglich
mit gerade in MySQL berechneten Werten weiterzurechnen?
Ich bekomme nämlich immer die Meldung "Unknown colum XX in field list"

Es geht nämlich um folgendes ...

Code:
SELECT v.Nation, v.ID, COUNT( v.Nation ) AS Anzahl, 
SUM(
IF ( plan.HID = v.ID AND plan.LigaID =1,
IF ( plan.HTore > plan.ATore, 500,
IF ( plan.HTore < plan.ATore, 75, 200) ) ,

IF ( plan.AID = v.ID AND plan.LigaID =1,
IF ( plan.ATore > plan.HTore, 500,
IF ( plan.ATore < plan.HTore, 75, 200 ) ) , 0 ) )
) AS Wertung
FROM WC_Spiele plan
JOIN WC_Nationen v ON plan.AID = v.ID OR plan.HID = v.ID
WHERE v.ID = plan.HID OR v.ID = plan.AID
GROUP BY Nation, ID
/* ORDER BY Points DESC */
Nun habe ich in "Wertung" eine Zahl stehen und in "Anzahl"
ebenso. Was ich nun machen wollen würde ist allerdings Wertung
durch Anzahl zu dividieren (also SUM(Wertung/Anzahl) as Points) und
dann danach in der ORDER BY Klausel danach sortieren zu lassen.
Aber da erhalte ich wie gesagt immer diese Fehlermeldung und wie
ich solche Einträge in PHP sortieren sollte, weiß ich ehrlich gesagt
leider auch nicht ... (falls es nicht über MySQL gehen sollte)
Mit Zitat antworten
  #13 (permalink)  
Alt 13-06-2007, 12:55
Gregor_Jelt
 Newbie
Links : Onlinestatus : Gregor_Jelt ist offline
Registriert seit: Jun 2007
Beiträge: 10
Gregor_Jelt ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Hallo,

entschuldigt bitte den Doppelpost, aber gibt es niemanden der
mir dabei vielleicht helfen könnte?
Mit Zitat antworten
  #14 (permalink)  
Alt 13-06-2007, 14:44
pekka
 PHP Master
Links : Onlinestatus : pekka ist offline
Registriert seit: Jun 2001
Ort: Köln
Beiträge: 6.608
pekka befindet sich auf einem aufstrebenden Ast
Standard

Zeig mal die genaue Query, wie sie abgesetzt wird, und die genaue Fehlermeldung. Oder ist "xx" der Spaltenname?
Mit Zitat antworten
  #15 (permalink)  
Alt 13-06-2007, 15:52
Gregor_Jelt
 Newbie
Links : Onlinestatus : Gregor_Jelt ist offline
Registriert seit: Jun 2007
Beiträge: 10
Gregor_Jelt ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Erstmal Danke für die Antwort.

Also erstmal das Grundgerüst bzw. die Idee ...


Code:
SELECT v.Nation, v.ID, COUNT( v.Nation ) AS Anzahl, 
SUM(
IF ( plan.HID = v.ID AND plan.LigaID =1,
IF ( plan.HTore > plan.ATore, 500,
IF ( plan.HTore < plan.ATore, 75, 200) ) ,

IF ( plan.AID = v.ID AND plan.LigaID =1,
IF ( plan.ATore > plan.HTore, 500,
IF ( plan.ATore < plan.HTore, 75, 200 ) ) , 0 ) )
) AS Wertung
FROM WC_Spiele plan
JOIN WC_Nationen v ON plan.AID = v.ID
OR plan.HID = v.ID
WHERE v.ID = plan.HID
OR v.ID = plan.AID
GROUP BY Nation, ID
Nun habe ich z.B. folgendes
ID = 3 / Anzahl = 2 / Wertung = 1100

Nun geht es mir nur darum, die Wertung durch die Anzahl
zu dividieren. Dazu hab ich folgendes nun gemacht:

Code:
SELECT v.Nation, v.ID,
SUM((
IF ( plan.HID = v.ID AND plan.LigaID =1,
IF ( plan.HTore > plan.ATore, 500,
IF ( plan.HTore < plan.ATore, 75, 200) ) ,

IF ( plan.AID = v.ID AND plan.LigaID =1,
IF ( plan.ATore > plan.HTore, 500,
IF ( plan.ATore < plan.HTore, 75, 200 ) ) , 0 ) ) )

/COUNT( v.Nation )) as Durchschnitt

FROM WC_Spiele plan
JOIN WC_Nationen v ON plan.AID = v.ID OR plan.HID = v.ID
WHERE v.ID = plan.HID OR v.ID = plan.AID
GROUP BY Nation, ID // Schon getestet auch mit v.Nation und v.ID - Gleicher Fehler
ORDER BY Durchschnitt DESC
Seitdem ich allerdings das so umgestellt habe, gibt es nun die
Meldung > #1111 - Invalid use of group function
Und es liegt 100% an der Division, denn wenn ich die ganze Divisionsgeschichte
entferne funktioniert es.
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

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
Affilinator - Affilinet XML Produktlisten Skript

Die Affilinator Affilinet XML Edition ist ein vollautomatisches Skript zum einlesen und darstellen der Affili.net (Partnerprogramm Netzwerk) Produktlisten und Produktdaten. Im Grunde gibt der Webmaster seine Affilinet PartnerID ein und hat dann unmittelb

27.08.2018 freefrank@ | Kategorie: PHP/ Partnerprogramme
 Alle PHP Scripte anzeigen

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