Wie kann ich flexible $_GETs abfragen?

Hi,
danke für Deine Mühe. Ich habs nun erstmal fix gemacht.
Muss ich nich mal ran.

Aber nun habe ich eine weitere Frage zum Thema:
Kann ich strings mit concat und group by zusammenfügen?

Und zwar habe ich eine Monatsübersicht mit group by group by date_format(einsaetze.datum,’%%M’)
Rauskomemn tut eine Liste:
Januar Mäntel
Februar Strümpfe,
März Hosen
Das Problem hierbei ist, dass er nur den letzten Wert nimmt. In Januar gibts zB noch Pullover und Mützen
Ohne Group by passt es auch. Nur habe ich dann statt 3 Zeilen 23…

Hi,
danke für Deine Mühe. Ich habs nun erstmal fix gemacht.
Muss ich nich mal ran.

Aber nun habe ich eine weitere Frage zum Thema:
Kann ich strings mit concat und group by zusammenfügen?

Und zwar habe ich eine Monatsübersicht mit group by group by date_format(einsaetze.datum,’%%M’)
Rauskomemn tut eine Liste:
Januar Mäntel
Februar Strümpfe,
März Hosen
Das Problem hierbei ist, dass er nur den letzten Wert nimmt. In Januar gibts zB noch Pullover und Mützen
Ohne Group by passt es auch. Nur habe ich dann statt 3 Zeilen 23…

Hi,
danke für Deine Mühe. Ich habs nun erstmal fix gemacht.
Muss ich nich mal ran.

Aber nun habe ich eine weitere Frage zum Thema:
Kann ich strings mit concat und group by zusammenfügen?

Und zwar habe ich eine Monatsübersicht mit group by group by date_format(einsaetze.datum,’%%M’)
Rauskomemn tut eine Liste:
Januar Mäntel
Februar Strümpfe,
März Hosen
Das Problem hierbei ist, dass er nur den letzten Wert nimmt. In Januar gibts zB noch Pullover und Mützen
Ohne Group by passt es auch. Nur habe ich dann statt 3 Zeilen 23…

Hallo Oliver,

ich kann dir hier nicht wirklich weiterhelfen.
Dies hat insbesondere erstmal den Grund, dass dein Frage sehr ungenau ist.
Du präsentierst ein spezifisches Problem aus deinem Skript - eine Dritte Person kennt aber natürlich dein Projekt nicht.
Du kannst also entweder mehr Details deines Projekts offen legen ODER du abstrahierst das Problem inkl. einem kleinen Beispiel.
Es würde ggf. schon helfen, wenn du erzählst, in welcher Sprache dein Projekt geschrieben wird und wie dein Code aussieht. Wenn das eine SQL-Abfrage ist, wäre zudem ein relevanter Ausschnitt deiner Datenbank interessant.

Beste Grüße
Jens

Hi Jens,
waow. Das ist schnell! :smile:
Dachte einfach weniger ist mehr und ich wollte Dich nicht gleich mit Seitenweise sql erschlagen.

OK Ich versuchs zu erklären.

Ich habe ua eine Tabelle verkauf
id,datum, material
1,2011-01-10|13,12,14
2,2011-01-11|16
3,2011-02-8,|61,62
4,2011-03-11|22,23,24

In der tabelle material ist dann ua

id, name
10,jacke
12,mütze
13,schal,
14,hose

11,anderejacke
16,anderemütze
13,andererschal,
14,anderehose

Die Spalte material in der Tabelle verkauf besteht aus strings der ids. Also am 10.01.2011 wurden drei Teile verkauft, am 11.01.11 1 Teil usw.

Nun möchte ich eine Monatsübersicht machen.
Januar|schal(13),mütze(12),hose(14), ->und anderemütze (16)

Hi,

du musst mit etwas mehr Infos rausrücken.
Ich vermute mal es geht jetzt um SQL?
Da musst du mal die Tabellenstruktur zeigen, sonst kann ich da nix zu sagen.

Dachte einfach weniger ist mehr und ich wollte Dich nicht gleich mit Seitenweise sql erschlagen.

OK Ich versuchs zu erklären.

Ich habe ua eine Tabelle verkauf
id,datum, material
1,2011-01-10|13,12,14
2,2011-01-11|16
3,2011-02-8,|61,62
4,2011-03-11|22,23,24

In der tabelle material ist dann ua

id, name
10,jacke
12,mütze
13,schal,
14,hose

11,anderejacke
16,anderemütze
13,andererschal,
14,anderehose

Die Spalte material in der Tabelle verkauf besteht aus strings der ids. Also am 10.01.2011 wurden drei Teile verkauft, am 11.01.11 1 Teil usw.

Nun möchte ich eine Monatsübersicht machen.
Januar|schal(13),mütze(12),hose(14), ->und anderemütze (16)

bitte versuch mir zukünftig genaue Infos zu geben:
-Welche Datenbank?
-Zeige die ganze Abfrage
-Gib mir einen Beispiel-Dump

Ich bemühe abermals die Glaskugel und gehe von MySQL aus:

SELECT Produktspalte, DATE_FORMAT(Datumsspalte,’%Y-%M’) as Monat
FROM Tabelle
GROUP BY Monat, Produktspalte;

*nicht gestestet! bin nicht ganz sicher ob ‚Monat‘ für die Group Klausel bereits ausgewertet ist, schlimmstenfalls einfach redundant per DATE_FORMAT grupieren*

So ists besser :smile:

Also Group_By kannst du soweit ich das überblicke vergessen.
Das bringt dir nur bei Zahlenwerten was - die kannst du dann bspw. aufsummieren oder Durchschnitte bilde. Möglich wäre vielleicht noch ein Join - damit kannst du aber auch keine Felder zusammenfassen.
Im Grunde müsste es auch irgendwie nach dem Schema funktionieren:
Select material FROM verkauf WHERE //Datum = Januar//;
Damit hättest du ja eigentlich alle Materialien aus dem Januar - musst die dann im php halt noch entsprechend auslesen.

Wenn das nicht klappt (weshalb auch immer), würde ich einfach alle Daten auslesen und via php-Schleife überprüfen.
Du kannst bspw. eine Schleife erstellen, die der Reihe nach die Monate abgeht. In der Schleife rufst du dann mittels SQL-Query die Datensätze auf, die in dem Monat liegen. Danach machst du eine zweite Schleife (in der ersten), die aus jedem Eintrag die Teile rausholt (alternativ kannst du auch erstmal nur die IDs holen und in einem Array zwischenspeichern).
Am Ende gibst du’s aus.

Ansonsten bin ich überfragt.

Beste Grüße
Jens

Es kommt immer auf die vorliegende Tabellenstruktur an. Ohne weite Details kann ich leider nicht helfen…

Jep, das Zauberwort heißt „group_concat“.

Hi,

so, wie ich das sehe, versuchst du da leider eine SQL-Datenbank nicht ganz im Sinne des Erfinders aufzubauen.

Du solltest in deiner Tabelle „Verkauf“ jedem einzelnen Materialverkauf an einem Datum einen eigenen Datensatz spendieren, statt für jedes Datum diese mit „,“ zu gruppieren. Die Tabelle sähe dann in deinem Beispiel so aus:

id datum material
1 2011-01-10 13
2 2011-01-10 12
3 2011-01-10 14
4 2011-01-11 16
5 2011-02-08 61
6 2011-02-08 62
4 2011-03-11 22,23,24

Dann kannst du die Einträge der Spalte Material mittels GROUP_CONCAT zusammenfügen, also in etwa so:

SELECT GROUP_CONCAT(name SEPERATOR ‚,‘) FROM Verkauf JOIN Material ON Verkauf.material = Material.id

Ich hab grad keinen SQL Server um das zu testen, es sollte aber funktionieren.

Hi,

ich verstehe deine Frage leider nicht ganz. Kannst du mir dein SQL schicken? Vielleicht hilft das weiter…

Hi Till,
die sql willst Du nicht sehen. :wink:
Nun gut:

select date_format(verkaeufe.datum,’%M’) as monat,sum(verkaeufe.zeit*verkaeufepersonal.stundensatz) as personalumsatz,verkaeufe.material_id as material_id_monat from verkaeufe,einsatzpersonal where verkaeufe.einsatzpersonal_id =einsatzpersonal.id and (if(1=999,0,quarter(einsaetze.datum)=1)or if(999=999,0,quarter(einsaetze.datum)=999)or if(999=999,0,quarter(einsaetze.datum)=999)or if(999=999,0,quarter(einsaetze.datum)=999)) and if(0=0,1,Date_Format(einsaetze.datum,’%Y’) = ‚0‘) group by date_format(einsaetze.datum,’%M’) order by einsaetze.datum asc

Also ich kann das Quartal und das Jahr wählen. Daraus filtert er mir dann die Werte (theoretisch).
Was ich möchte ist eine dynamische Monatsübersicht.

Angezeigt werden soll mir der Umsatz an Material und demgegenüber die Kosten des Verkäufers (Azubi, Aushilfe,Vollkraft)
In der Tabelle.
Also Meier ist Aushilfe, hat 3 Stunden für je 12,50€ gearbeitet und 145€ umgesetzt.
Müller ist Vollkraft, hat 8 Stunden für je 22€ gearbeitet und 895€ umgesetzt.
In der Spalte verkauf.Material stehen die Material-ids als string (12,23,45)

Als Ergebnis möchte ich eine Tabelle haben, die mir anzeigt:

Januar Kosten für MA 965€, Gesamtstunden 465 STd. Umsatz Material 8654€
Februar 899€, 450 Stunden, 1200€ Material

Schau mal hier:
http://de3.php.net/manual/de/control-structures.fore…

Der ForEach-Konstrukt auf das $_GET-Array losgelassen geht alle Elemente durch und tut etwas mit dem entsprechenden Element.

Greets,
Markus

thanx!
Hm. Ich habs nun gelöst Allerdings in 2 Abfragen. Aus irgendeinem Grund hat er beim find_in_set eine doppelsummierung drin. Wnn zB zwei Termine an einem Tag waren…
un habe ich einen Zähler mitlaufen lassen, die Zweitre Abfrage in eine Array zählen lassen und dann mit $array[$x] das Ganze abgefragt. Und so tut es…

Hallo Oliver,

grundsätzlich würde ich die Checkboxen gleich als „Array“ deklarieren, da dir dann $_GET in PHP gleich als Array zur Verfügung steht.

z.B.

oder gleich die Jahreszahl

so spart man sich das zusammenbauen der Werte in der for Schleife!

Abfrage wäre dann:

if(is\_array($\_GET['jahr'])){

foreach($\_GET['jahr'] as $key =\> $value){
}
$key == 2008
$value == 1
}

Was mich noch wundert warum das ganze als $_GET und nicht $_POST empfangen wird?!?

Hi,
ja get ändere ich noch. War so einfacher die Werte zu kontrollieren.
Danke für Deine Antwort! Ich abe es mittlerweile gelöst.

Aber nun möchte ich einfach mal ein weiteres Folgeproblem hinfügen, wenn ich darf.

Und zwar hakts nun am sql-Query. Di Anzahl der Jahre kann nämlich 2,3,4 oder sonstwas sein. Ich kann natürlich das ganze fix machen und anbieten 1-10 Jahre zurück zu gehen und dann via if 10 verschiedene Queries anbieten.

Heraus kommt dann sowas wie:
select wert,datum,… from einsaetze,material,… where
(if(999=1,date_format(datum,‚Y‘)=2011) or
(if(999=1,date_format(datum,‚Y‘)=2010) or
(if(999=1,date_format(datum,‚Y‘)=2009) or

Nur die Anzahl der ifs ist nicht flexibel wenn ichs fest mache. Zudem nutze ich noch sprintf. Irgendwie muss ich das verhakstücken,. Vielleicht eine for-schöeife?
for($t=1;$t

Hallo Oliver,

da kommt es nun drauf an wie dir die $_GET/$_POST Werte zur Verfügung stehen? Wenn du es so gemacht hast, wie ich in der ersten Anfrage geschrieben, wäre es total simple:

if(is\_array($\_GET['jahr'])){
 $yc=count($\_GET['jahr']);
 $z=1;
 $sql="SELECT bla bla FROM foo WHERE";
 foreach($\_GET['jahr'] as $key =\> $value){
 $sql.= " year = '".$key."'".($z

Da brauch man keine IF-Schleife, da hier einfach die Werte dürch die $\_GET/$\_POST gegeben sind. Und kann wegen mir bis 100 Jahre zurück.

Grüße
Elsoregro

Hallo Oliver,

sorry, habe erst jetzt Zeit zum Antworten. Also die IFs in der where Klausel sind irgendwie unsinnig, da die die Werte in der Bedingung ja schon vorgibst. Z.B. wird „999=999“ immer true ergeben.

Du musst vor allem nach den Werten die du ausgibst auch gruppieren. Also ungefähr so:

select date\_format(verkaeufe.datum,'%M') as monat, sum(verkaeufe.zeit\*verkaeufepersonal.stundensatz) as personalumsatz, verkaeufe.material\_id as material\_id\_monat 
from verkaeufe, einsatzpersonal 
where verkaeufe.einsatzpersonal\_id =einsatzpersonal.id 
group by date\_format(einsaetze.datum,'%M'), sum(verkaeufe.zeit\*verkaeufepersonal.stundensatz), verkaeufe.material\_id
order by einsaetze.datum asc

Wenn Du den Zeitraum dynamisch vorgeben willst, dann kannst du in deine Where Klause noch sowas einbauen:
"… and einsaetze.datum >= ‚$starttime‘ and einsaetze.datum