3 while Schleifen in einander

djjlx

---???---
ID: 62937
L
9 Mai 2006
599
21
Hallo zusammen,

Ich sitzt nun schon seit einigen Tagen an einem Problem und komm einfach nicht weiter

Folgender Code:

PHP:
$int_kw = db_query("SELECT DISTINCT (kw) FROM `".$dbprefix."_ar_calc` WHERE `arID` = '%d' ORDER BY `kw` AND `btb`",$arID)or die(mysql_error());
    while($kw = mysql_fetch_array($int_kw))
    {
        $int_pos = db_query("SELECT DISTINCT (pos), btb  FROM `".$dbprefix."_ar_calc` WHERE arID = '%d' AND kw = '%s' ORDER BY kw, btb,price",$arID,$kw['kw'])or die(mysql_error());
        while($pos = mysql_fetch_array($int_pos))
        {

            $int_pid = db_query("SELECT DISTINCT (a.pid) AS pid, p.name, p.vorname  FROM `".$dbprefix."_ar_calc` AS a LEFT JOIN `".$dbprefix."_personal` AS p ON a.pid = p.pid  WHERE arID = '%d' AND kw = '%s' AND btb = '%s' AND pos = '%d' ORDER BY kw,btb,price,pid",$arID,$kw['kw'],$pos['btb'],$pos['pos'])or die(mysql_error());
            while($pid = mysql_fetch_array($int_pid))
            {

                $summen = db_query("SELECT SUM(h) AS h FROM ".$dbprefix."_ar_calc WHERE arID = '%d' AND kw = '%s' AND pos = '%d' AND btb = '%s' AND pid = '%d'",$arID,$kw['kw'],$pos['pos'],$pos['btb'],$pid['pid'])or die(mysql_error());
                $sum = mysql_fetch_array($summen);
            }
        }
    }

Die Tabellenstruktur und Musterdaten
Code:
`id` | `arID` | `btb` | `pid` | `kw` | `pos` | `h` | `price` | `wert` 
******
1  |	3597 	| 0001001 | 2 | 40/2014 | 1 |   	9.00|	31.50 |   283.50 	
2  |	3597 	| 0001001 | 2 | 40/2014 | 6 | 	9.00|	0.27 	|   2.43 	
3  | 	3597 	| 0001001 | 2 | 40/2014 | 7 |	9.00|	0.60 	|   5.40 	
4  |	3597  | 0001001 | 3 | 40/2014 | 1 |	8.00|	20.00 |   160.00 	
5  |	3597 	| 0001001 | 3 | 40/2014 | 6 |	8.00|	0.27 	|   2.16
6  |	3597 	| 0001001 | 3 | 40/2014 | 7 |	8.00|	0.60 	|   4.80

So in der ersten whileschleife möchte ich die einzigartigen KW´s auslesen die die arID 3597 haben in diesem Bsp nur eine können aber mehere sein.

Ergebnissätze 1 = 40/2014

dann will ich zu jeder KW die einzigartigen Pos und den dazugehörigen btb
Ergebnissätze 3 = 1(0001001),6(0001001),7(0001001)

dann brauch ich auf diese filterung die einzigartige pid = PersonalID
Ergebnissätze 2 = 2,3

zu guter letzt hol ich mir die Summen zu den einzelnen Pid´s

Grundsätzlich funktioniert das auch nur hab ich nun probleme mit der ausgabe
ich bräuchte so ein Layout:
Code:
KW          NAME             BTB          Pos1          Pos6      Pos 7
40/2014   Max Muster     001001      9h- 283.50  9h 2.43  9h- 5.40
              Max1 Muster1  001001      8h- 160.00  8h 2.16  8h- 4.80

Das Problem es kommt in einer anderen Reihnfolge raus
Code:
kw -> POS 1 -> Pid 2 -> wert
                      Pid 3 -> wert
         POS 2 -> Pid 2 -> wert
                      Pid 3 -> wert
usw.

Demnach müsste ich die tabelle Spaltenweiße ausgeben und nicht Zeilen weiße.

Mein Gedankengang ist nun das ganze in einen Array zu speichern und genau da scheiters
PHP:
Array(
 [kw] = 40/2014
           [btb] = 0001001 
                      [pid] = Max Muster
                                [POS1] = 9
                                [POS6] = 9
                                [POS7] = 9
                      [pid] = Max1 muster1
                                [pos1] = 8
                                [Pos6] = 8
                                [Pos7] = 8
oder so ähnlich so das ich im nachhinein die Tabelle Zeilenweise aufbauen kann

KW = $array[kw] BTB = $array[kw][btb] usw.

Hat da jemand Rat?

Gruß
djjlx
 
Ohne das jetzt genauer anzugucken: Du hast eine Tabelle und brauchst O(n³)?! 8O
Kannst du das nicht einfach mit einer einzigen Abfrage machen? Sieht mir n bisschen nach Overkill... bzw. Server-Kill aus :ugly:

Die erste Abfrage filtert doch z.B. nur eine bestimmte numerische ID (die vorhin zu String gecastet wird? :hö:).
 
Habs mir auch nicht näher angeschaut, glaube aber group by wäre hilfreich, was bei mysql noch vielleichter ist als bei mssql...
 
Morgen!

Bitte schaut es euch genauer an ;)

Ja davon bin ich auch ausgegangen das die MySql Abfrage optimiert gehört nur bei den verschachteln ineinander hab ich sehr schnell TILT im Kopf stehen :(
 
Zur SQL-Abfrage:

So in der ersten whileschleife möchte ich die einzigartigen KW´s auslesen die die arID 3597 haben.
Code:
SELECT kw
FROM `_ar_calc`
[COLOR="Green"]WHERE arId = 3597[/COLOR]
GROUP BY kw
ORDER BY kw ASC

dann will ich zu jeder KW die einzigartigen Pos und den dazugehörigen btb
Code:
SELECT kw[COLOR="Red"], btb, pos[/COLOR]
FROM `_ar_calc`
WHERE arId = 3597
GROUP BY kw[COLOR="red"], pos, btb[/COLOR]
ORDER BY kw ASC[COLOR="red"], btb ASC[/COLOR]

dann brauch ich auf diese filterung die einzigartige pid = PersonalID
Code:
SELECT kw, btb[COLOR="Red"], pid[/COLOR], pos
FROM `_ar_calc`
WHERE arId = 3597
GROUP BY kw, pos, btb[COLOR="red"], pid[/COLOR]
ORDER BY kw ASC, btb ASC[COLOR="red"], pid ASC[/COLOR]

zu guter letzt hol ich mir die Summen zu den einzelnen Pid´s
Code:
SELECT kw, btb, pid, pos[COLOR="red"], SUM(h) AS h[/COLOR]
FROM `_ar_calc`
WHERE arId = 3597
GROUP BY kw, pos, btb, pid
ORDER BY kw ASC, btb ASC, pid ASC

Name und Vorname?
Code:
SELECT kw, btb, [COLOR="red"]a.[/COLOR]pid, [COLOR="red"]p.name, p.vorname, [/COLOR]pos, SUM(h) AS h
FROM `_ar_calc`[COLOR="red"] AS a
LEFT JOIN `_ar_personal` AS p ON (a.pid = p.pid)[/COLOR]
WHERE arId = 3597
GROUP BY kw, pos, btb, pid[COLOR="red"], name, vorname[/COLOR]
ORDER BY kw ASC, btb, pid ASC

Sollte so funktionieren. Sieht jedenfalls besser und einfacher aus, als deine while-Verschachtelung ;)

Bei der Ausgabe musst du lediglich einmal die ersten drei Werte ausgeben, und dann die ganzen Positionen anhängen. (Wenn Personal 2 unterschiedliche Positionen haben kann, wie Personal 3, dann musst du zusätzlich noch nachsehen, in welchen Spalten du die Werte einträgst.)

Hier solltest du eventuell besser Beschreiben, woran du genau scheiterst.