Bestaat er binnen PHP iets als continue zoals in Java of is dat GOTO?

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Nkamp Kamp van de

nkamp Kamp van de

01/05/2017 11:07:21
Quote Anchor link
Hallo,


Ik zit min of meer met een volgorde probleem en ik probeer het hieronder in de code uit te leggen/beschrijven. Ik had gedacht dat ik het nooit zou gaan toe passen 'continue <label>'. Is in PHP het statement GOTO de vervanger of... kun je het syntaxis wat netter oplossen?

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
<?php
$SQLMainQuery
= "SELECT...";
$RSM=($con, $SQLMainQuery)

while (odbc_fetch_array($ResultMainQuery) {
   current_main_key_value =
  
Label_Continue:
   if (previous_key_value !== current_main_key_value) {
      $SQLSubQuery = "SELECT... FROM VIEW WHERE Subquery_value = Mainquery_value";
      $RSS=($con, $SQLSubQuery)

      //Doe vullen array met sub query waarden
   }
  
   previous_key_value = current_main_key_value;
   //Doe vullen array MAIN query gegevens

   // Zoals je ziet is de WHERE clause van de sugquery afhankelijk van de Main query "WHERE Subquery_value  
   // = Mainquery_value"
   //
   // HET PROBLEEM ZIT HEM IN HET LAATSTE MAIN RECORD, WANT DAN WIL JE NOG KIJKEN OF HET ARRAY NOG
   // AANGEVULD MOET WORDEN MET SUB QUERY GEGEVENS. Het punt is dat voor de main query je weet niet wanneer
   // het laatste record voor een bepaalde key waarde bereikt is, het aantal is voor een bepaalde key
   // waarde van een regel verschillend aantal records voor een bepaalde key value gereturned worden.
   // LET OP: wat ik bedoel met het aantal records voor een zekere key waarde zijn de afzonderlijke records
   // binnen de main query en is een ander aantal dat het totale aantal records van de main query
   // Dus zat ik te denken wat in JAVA bestaat "Continue" dus:

  
   continue Label_Continue; //Voer de subquery uit en kijk of de main recods nog aangevuld moeten worden

   // Of is dat het bekende 'basic' syntax "GOTO"

}

?>


Nico
 
PHP hulp

PHP hulp

25/04/2024 11:33:22
 
Thomas van den Heuvel

Thomas van den Heuvel

01/05/2017 13:13:23
Quote Anchor link
Is dit niet gewoon een hele ingewikkelde manier om een LEFT (of RIGHT) JOIN uit te voeren?

EDIT: zoals ik het zie heb je een soort van verzameling A en een verzameling B en in verzameling B zitten meerdere items die bij één item van A horen. Met een query op verzameling A met een LEFT JOIN op B kun je in 1x alle gewenste informatie ophalen. Het uitsplitsen van resultaten in een array kun je on-the-fly te doen door te kijken of het item uit A verandert tijdens elke iteratie.
Gewijzigd op 01/05/2017 13:20:33 door Thomas van den Heuvel
 
Nkamp Kamp van de

nkamp Kamp van de

01/05/2017 17:39:08
Quote Anchor link
Nee, dat denk ik niet, al ben ik ook maar een goed willende query programmeur. Maar wat het is in de main query groepeer ik bepaalde zaken op basis van twee velden. Die sub query moet op basis van het groepsniveau weer uitgevoerd worden, die op zich ook weer gegroepeerd is.

Ik heb het inmiddels met GOTO aan het werken, maar het voelt zo verkeerd...

(Het is ook wel geinig als je uitleg van PHP.net er bij naast legt is het precies mijn situatie. Toen ik het vorige week heb opgezet dacht ik Wow, lekker mooi zo kan ik het oplossen, totdat ik zag dat voor het laatste main regel de sub regel er van ontbrak....)
 
Ben van Velzen

Ben van Velzen

01/05/2017 17:41:08
Quote Anchor link
>> Nee, dat denk ik niet, al ben ik ook maar een goed willende query programmeur. Maar wat het is in de main query groepeer ik bepaalde zaken op basis van twee velden. Die sub query moet op basis van het groepsniveau weer uitgevoerd worden, die op zich ook weer gegroepeerd is.

Precies, en dat los je op met joins, en niet in je code.
 
Aad B

Aad B

01/05/2017 22:44:12
Quote Anchor link
De mogelijkheden met SQL zijn bijna oneindig. Oplossen met joins, nested selects of subquery's binnen een hoofdquery. Data verzamelen in php zoveel mogelijk of altijd voorkomen. Een 2e query afvuren in een PHP WHILE of FOR loop is killing, steeds opnieuw naar het MySQL engine gaan is echt niet okee. Door gebrek aan diepgaande SQL kennis wordt er vaak mega veel data opgehaald en geprocessed in php array's met als gevolg performance problemen nu of op termijn, memory exhausted problemen etc. Kortom oplossn in SQL en ik denk dat hier nested selects wel kunnen helpen. Ook zorgvuldig (extra) indexen plannen om de MySQL performance te garanderen.
Gewijzigd op 01/05/2017 23:21:32 door Aad B
 
Ward van der Put
Moderator

Ward van der Put

02/05/2017 10:12:03
Quote Anchor link
Ook PHP kent een goto maar die gebruiken we liever niet:

http://php.net/manual/en/control-structures.goto.php

Afbeelding
 
Nkamp Kamp van de

nkamp Kamp van de

03/05/2017 21:36:28
Quote Anchor link
Ok, dan hoop ik dat jullie mij hiermee kunnen helpen door de sqlMain en de sqlSub samen te voegen. Ook met een sub query zie ik het even niet maar ik ben zeker bereid om te leren.

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
<?php
$sqlMain
= "SELECT ISNULL(vra.SEKLVL3 COLLATE SQL_Latin1_General_CP1_CI_AS, 'LEEG') as SEKLVL3
                  ,ISNULL(vra.NORMVALUE COLLATE SQL_Latin1_General_CP1_CI_AS, 'LEEG') as NORMVALUE
                  ,sum(vra.WAARDE + vra.WAARDE2) as VALUE
            FROM dmn.view_xxxx vra
            WHERE vra.JAAR      = "
.$year."
              AND vra.MAAND     = "
.$month."
            GROUP BY vra.SEKLVL3 COLLATE SQL_Latin1_General_CP1_CI_AS
                    ,vra.NORMVALUE  COLLATE SQL_Latin1_General_CP1_CI_AS
            ORDER BY (CASE WHEN vra.SEKLVL3 COLLATE SQL_Latin1_General_CP1_CI_AS IS NULL THEN 1 ELSE 0 END),
                                                        vra.SEKLVL3  COLLATE SQL_Latin1_General_CP1_CI_AS;"
;

$getResultMain = odbc_exec($con, $sqlMain );
      

while($row = odbc_fetch_array($getResultMain)) {
    $keySekLvl3 = odbc_result($getResultMain, 'SEKLVL3');

    if (($keyPreviousSectorLvl3 !== $keySekLvl3) && ($keyPreviousSectorLvl3 !== '')) {
        // Het beruchte Goto label
        Label_CheckSubrows:

        $sqlSUB =  "SELECT ISNULL(vra.SEKLVL4 COLLATE SQL_Latin1_General_CP1_CI_AS, 'LEEG') as SEKLVL4
                          ,ISNULL(vra.NORMVALUE COLLATE SQL_Latin1_General_CP1_CI_AS, 'LEEG') as NORMVALUE
                          ,sum(vra.WAARDE + vra.WAARDE2) as VALUE
                    FROM dmn.view_xxxx vra
                    WHERE vra.SEKLVL3    = '"
.$keySekLvl3."'
                      AND vra.JAAR       = "
.$year."
                      AND vra.MAAND      = "
.$month."
                    GROUP BY vra.SEKLVL4 COLLATE SQL_Latin1_General_CP1_CI_AS
                            ,vra.NORMVALUE COLLATE SQL_Latin1_General_CP1_CI_AS
                    ORDER BY (CASE WHEN vra.SEKLVL4 COLLATE SQL_Latin1_General_CP1_CI_AS IS NULL THEN 1 ELSE 0 END),
                                            vra.SEKLVL4  COLLATE SQL_Latin1_General_CP1_CI_AS;"
;
        $getResultSub = odbc_exec($con, $sqlSUB);

        while($row = odbc_fetch_array($getResultSub)) {

            if ($keySubRowSeKLvl4 !== odbc_result($getResultSub, 'SEKLVL4')) {
                $keySubRowSeKLvl4 = odbc_result($getResultSub, 'SEKLVL4');

            }
        }


        // Hier verder met de (volgende) main record --> welke een kolom moet zijn
        if (laatste main record)
           goto Label_CheckSubrows; // voeg nog de laatste subregels toe aan de presentatie
    }
}

?>


Beide query's geven de sommatie terug die per kolom getoond moet vorden:


[/tr]




[/table]

Dus voor SekLvl3 resp. SekLvl4 worden records gereturned, die overeenkomstig in één van de NORMVALUE kolommen getoond moeten worden. Maar niet iedere kolom voor iedere regel is altijd gevuld, dat varieerd. Voor beide query wordt dezelfde view gebruikt

Ik hoop dat ik het duidelijk heb kunnen maken, waar het om gaat en mijns inziens kan dit niet met sub query, maar zoals eerder gezegd ik ben altijd bereid om te leren en mijn kennis uit te breiden.

Gr.,

Nico
Key Sek valueNORMVALUE 1NORMVALUE 2NORMVALUE 3NORMVALUE n
Sek Main Lvl xMainRecord1 value[/tdMainRecord2 valueMainRecord3 valueManRecordn value
- Sek Sub Lvl x1SubRecord1 valueSubRecord2 value-SubRecordn value
- Sek Sub Lvl x2SubRecordn+1 value-SubRecordn+2 value-
Sek Main Lvl yMainRecordn+1 value--MainRecordn+2 value
- Sek Sub Lvl y1SubRecord1 valueSubRecord2 value--
Gewijzigd op 03/05/2017 23:52:14 door nkamp Kamp van de
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.