etops Geschrieben 4. Dezember 2003 Teilen Geschrieben 4. Dezember 2003 Hallo, ich habe die Aufgabe, mittels PHP die Daten einer MySQL-Tabelle auszulesen. Das hört sich zunächst recht simpel an, allerdings bin ich bereits über einige Fallen gestolpert, bei denen ich noch nicht so recht einen Lösungsansatz gefunden habe. Vielleicht hat ja jemand von Euch einen Rat? Konkret sieht die Tabelle so aus: Datum | VAW1 | VAW2 | VAW3 | ... | VAW10 In den Spalten VAW1 - VAW10 steht jeweils eine Zahl zwischen 0 und 99, bestimmte Zahlen gehören zu einer Gruppe (manchmal ein geschlossener Bereich, z.B. 41-49, manchmal verstreute Zahlen, z.B. 21,24,37,52, etc). Ich soll nun auswerten, wie oft die Werte einer Gruppe (die entsprechend in jedem Feld von VAW1 bis VAW10 enthalten sein können) im Zeitraum X vorgekommen sind. Der erste Ansatz war mit SELECT COUNT aber das wollte nicht gut funktionieren. Hat jemand eine zündende Idee, wie ich das evtl einfacher oder schneller hinkriegen kann? Das wäre super Danke + Gruß etops Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Mr. Database Geschrieben 4. Dezember 2003 Teilen Geschrieben 4. Dezember 2003 Hi, wie hast du deine Tabellen für die Gruppen aufgebaut? z.B. Gruppe1 --> Feld Zahlen --> Einträge: 40 41 ... 49 oder eher so: Gruppe1 --> Felder: von, bis -->einträge: 40 49 ? Die 2 Frage wäre, willst du die Anzahl der Datensätze wissen die in Werte aus der Gruppe enthalten (also egal in welcher Spalte 1-10) --> ein DS wird nur 1mal gezählt, auch wenn der Wert in Spalte 1 + 3 + 5 in der Gruppe enthalten ist. Oder soll dann Gezählt werden wie oft der Wert in der Ganzen Tabelle enthalten ist.--> z.B. Es sind 104 Einträge der Gruppe1 zuzuordnen. oder willst du dies auch Spaltenspeziefisch lösen z.B. IN der Spalte VAW 1 sind 43 Einträge aus der Gruppe1 enthalten... Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
etops Geschrieben 4. Dezember 2003 Autor Teilen Geschrieben 4. Dezember 2003 Hallo Mr Database (welch passender Name ), der mittlere Ansatz ist der richtige, d.h. ich möchte wissen, wie oft die Werte einer bestimmten Gruppe in den bestimmten Feldern vorkommen (z.B. Werte der Gruppe XY kamen in den Spalten bla1 bis bla4 137 mal vor). Alternativ muß ich nicht unbedingt sofort nach Gruppen aufteilen sondern es würde auch gehen, daß ich einfach herauskriege, daß die Werte 41, 37, 59, 64, 81 und 12 insgesamt in diesen Feldern 635mal aufgetaucht sind. Bisher ist die Tabelle so aufgebaut, daß ich 10 Spalten habe, in denen die entsprechenden Werte drinstehen - eben 0 bis 99. Danke für weitere Hilfe -etops- Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Jaraz Geschrieben 4. Dezember 2003 Teilen Geschrieben 4. Dezember 2003 Hi, ist das deine Tabelle? Dann fang doch einfach mal an zu normalisieren. Wenn es von nem Fremdhersteller ist, viel Spass beim zerflücken. Gruß Jaraz Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
etops Geschrieben 4. Dezember 2003 Autor Teilen Geschrieben 4. Dezember 2003 Ich würde ja gerne normalisieren oder dieses und jenes zwischendurch mit der Tabelle machen - nur leider hat die Tabelle noch andere Felder (die jeden Datensatz eindeutig machen) die aber hierfür nicht relevant sind. Irgendwie muß das doch auszuwerten sein... Was ist der Grund, daß man SELECT COUNT nicht mit UNION verbinden kann...es muß doch gehen, mit Ergebnissen solcher Abfragen weiterrechnen zu können?! Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Jaraz Geschrieben 4. Dezember 2003 Teilen Geschrieben 4. Dezember 2003 Original geschrieben von etops Ich würde ja gerne normalisieren oder dieses und jenes zwischendurch mit der Tabelle machen - nur leider hat die Tabelle noch andere Felder (die jeden Datensatz eindeutig machen) die aber hierfür nicht relevant sind. Das ist imho irrelevant! Was machst du z.B. wenn dein Chef kommt und sagt wir brauchen aber noch VAW11. Dann musst du die Datenbank ändern, den Code ändern, kompilieren, neue Version ausliefern usw. usw. Also Tabelle für die VAWs und Tabelle für die IDs oder Gruppen erstellen und entsprechend verknüpfen. Gruß Jaraz Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
just_me Geschrieben 4. Dezember 2003 Teilen Geschrieben 4. Dezember 2003 @Jaraz 1. Es steht die Frage, warum diese Tabelle in die 5.NF gehoben werden sollte. Wenn die Bedingung lautet, einen Select über die Tabelle laufen zu lassen, und dieser sich als komplex erweist, ist es natürlich schön, wenn man ändern und den aktuellen Wünschen entsprechend anpassen kann, aber es ist mindestens ebenso fraglich, ob eine Änderung á là "... was wäre, wenn ..." wirklich erfolgsversprechend ist. Nebenfrage: "Was wäre, wenn diese Tabelle Teil einer OLAP-Anwendung ist?" Dann wäre Normalisierung schlicht "tödlich", weil nervenaufreibende Optimierungsvorgänge stattfinden müssen, die man mit so simplen Dingen, wie einer "schlichten" Normalisierung vermeiden kann. 2. Ist die Diskussion eines "Was wäre, wenn..." ganz sicher nicht im Sinne der Aufgabe, oder? @etops Ich vermute, dass du mit einer einfachen Abfrage nicht allzu weit kommen wirst. Allerdings ist mir keine Situation geläufig, in der UNION nicht mit einem SELECT COUNT kooperieren würde. Eine mögliche Alternative ist es, über alle Spalten separate, evtl. nach Gruppen aufgelöste, SELECTs laufen zu lassen, und die Ergebnisse dann mit array_merge zu mischen. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Mr. Database Geschrieben 5. Dezember 2003 Teilen Geschrieben 5. Dezember 2003 Also muss erstmal zustimmen: am besten wäre es die Tabelle zu normalisieren: Es gibt jedoch auch eine Lösung über sql, jedoch ist diese Extrem umständlich und lang, da ist es wohl wirklich besser, das ganze über den PHP Code abzufragen: Hier trotzdem die SQL Lösung: select sum(anzahl) as vorkommnis from ( select count(*) as anzahl from eintraege where VWA1 in (select zahl from gruppe1) and eintraege.datum < #01/01/2004# and eintraege.datum > #01/01/2001# union all select count(*) as anzahl from eintraege where VWA2 in (select zahl from gruppe1) and eintraege.datum < #01/01/2004# and eintraege.datum > #01/01/2001# union all select count(*) as anzahl from eintraege where VWA3 in (select zahl from gruppe1) and eintraege.datum < #01/01/2004# and eintraege.datum > #01/01/2001# union all select count(*) as anzahl from eintraege where VWA4 in (select zahl from gruppe1) and eintraege.datum < #01/01/2004# and eintraege.datum > #01/01/2001# union all select count(*) as anzahl from eintraege where VWA5 in (select zahl from gruppe1) and eintraege.datum < #01/01/2004# and eintraege.datum > #01/01/2001# union all select count(*) as anzahl from eintraege where VWA6 in (select zahl from gruppe1) and eintraege.datum < #01/01/2004# and eintraege.datum > #01/01/2001# union all select count(*) as anzahl from eintraege where VWA7 in (select zahl from gruppe1) and eintraege.datum < #01/01/2004# and eintraege.datum > #01/01/2001# union all select count(*) as anzahl from eintraege where VWA8 in (select zahl from gruppe1) and eintraege.datum < #01/01/2004# and eintraege.datum > #01/01/2001# union all select count(*) as anzahl from eintraege where VWA9 in (select zahl from gruppe1) and eintraege.datum < #01/01/2004# and eintraege.datum > #01/01/2001# union all select count(*) as anzahl from eintraege where VWA10 in (select zahl from gruppe1) and eintraege.datum < #01/01/2004# and eintraege.datum > #01/01/2001# ) ; Dabei gehe ich davon aus dass die Tabelle mit den Spalten VWA ... eintraege heißt, und die Tabelle mit den Zahlen einer Gruppe gruppe1 (spalte zahl) heißt. Dies könnte man bei mehrern Gruppen natürlich auch in einer Tabelle zusammenfassen! Wenn du an der DB nichts extrem ändern willst würde ich dir raten, das ganze wirklich über einfache selects in PHP zu realisieren! Ich hoffe dass hilft dir etwas weiter! Gruß Mr. Database Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.