Cookies op Tweakers

Tweakers maakt gebruik van cookies, onder andere om de website te analyseren, het gebruiksgemak te vergroten en advertenties te tonen. Door gebruik te maken van deze website, of door op 'Ga verder' te klikken, geef je toestemming voor het gebruik van cookies. Wil je meer informatie over cookies en hoe ze worden gebruikt, bekijk dan ons cookiebeleid.

Meer informatie
Toon posts:

Query voor ophalen resultaten gekoppeld aan parent structuur

Pagina: 1
Acties:

Onderwerpen


  • TheCrius
  • Registratie: mei 2008
  • Laatst online: 18:29
Goedemorgen medetweakers,

Ik probeer resultaten uit de database te halen welke gekoppeld zijn aan een situatie. De structuur is als volgt:

## Situaties
Situatie_id
Situatie_parent_id
Situatie_naam

Voorbeeld data:
1 - NULL - Amsterdam
2 - 1 - Verkoop
3 - 2 - Team A
4 - 2 - Team B

## Resultaat
Resultaat_id
Resultaat_percentage
Situatie_koppel_id (gekoppeld aan situatie_id)

Voorbeeld data:
1 - 50 - 4
1 - 55 - 3

Waar ik mee bezig ben is een query die per team, maar ook per afdeling en per locatie data weergeeft.
Uit een dropdown haal ik alle situaties met parents, dit werkt prima. Bij het kiezen van een situatie (welke zich op een bepaald niveau bevindt) haal ik met queries afzonderlijk per niveau de parent op, en consolideer ik deze data uiteindelijk. Ik kijk dus eerst als volgt: is het ID dat ik wil weergeven een ID met childrens en hebben deze childrens ook weer childrens.
Als ik nu dus resultaten van Amsterdam wil ophalen, dus ook resultaten van alle childrens, dan heb ik losse query's voor elk niveau en voeg ik dit samen. Mijn gevoel zegt dat ik hier gigantisch omslachtig bezig ben.
Heeft iemand een goede beredenering welke ik kan gebruiken in deze situatie? :*)

Falling down is how we grow. Staying down is how we die. --Brian Vaszily


  • RobIII
  • Registratie: december 2001
  • Laatst online: 19:46

RobIII

Admin Devschuur®

^ Romeinse 3 ja!

Hoewel me niet helemaal duidelijk is wat je nou precies bedoelt; het ophalen van parent/child principe is hier bijvoorbeeld best aardig uitgelegd.

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Roses are red Violets are blue, Unexpected ‘{‘ on line 32.

Over mij


  • cariolive23
  • Registratie: januari 2007
  • Laatst online: 15:19
Dat kun je met een recursieve query doen, een CTE. Op PFZ staat een aardig voorbeeld, zou moeten werken op de betere databases.

http://www.pfz.nl/wiki/commontableexpression/

  • TheCrius
  • Registratie: mei 2008
  • Laatst online: 18:29
@Roblll Dat principe heb ik inderdaad al toegepast, in het ophalen en het opslaan van gegevens.

@Cariolive23 Precies wat ik zoek. Bedankt dit gaat me probleem oplossen.

Falling down is how we grow. Staying down is how we die. --Brian Vaszily


  • NMe
  • Registratie: februari 2004
  • Laatst online: 16:51

NMe

Quia Ego Sic Dico.

cariolive23 bedoelt met zijn eeuwige gesneer over "de betere databases" dat MySQL dit niet ondersteunt, dus als je MySQL gebruikt zul je toch naar Rob's methode moeten kijken.

Overigens vind ik het in dit soort gevallen meestal handiger om crisp's methode toe te passen, alleen al vanwege de leesbaarheid.

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


  • TheCrius
  • Registratie: mei 2008
  • Laatst online: 18:29
Heb het zojuist geprobeerd maar ik krijg het inderdaad niet werkend, was nog niet zo ver dat het aan MySQL lag. Op het moment gebruik ik al de volgende code (gebaseerd op de code van Crisp):
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
// ophalen sitaties en maken van tree
                                $result = mysql_query(" 
                                SELECT 
                                 situatie_id, situatie_parent_id, situatie_naam
                                FROM 
                                 situatie 
                                ORDER BY 
                                situatie_naam ,situatie_parent_id
                                ") or die ( mysql_error () ); 
                                    // in array zetten
                                $menuData = array( 
                                    'items' => array(), 
                                    'parents' => array() 
                                ); 
                                
                                while ($menuItem = mysql_fetch_assoc($result)) 
                                { 
                                    $menuData['items'][$menuItem['situatie_id']] = $menuItem; 
                                    $menuData['parents'][$menuItem['situatie_parent_id']][] = $menuItem['situatie_id']; 
                                } 
                            
                            echo bouwAnalyseSituaties('', $menuData);    // functie van Crisp

Zal kijken of ik hier het een en ander in kan verbouwen zodat ik een overzicht terug kan krijgen waarin ook de (gemiddelde) resultaten per ID zichtbaar worden.

Falling down is how we grow. Staying down is how we die. --Brian Vaszily


  • TheCrius
  • Registratie: mei 2008
  • Laatst online: 18:29
Ben er druk mee aan de slag geweest maar moet zeggen dat ik er nog niet uit kom.
Zal pogen een betere omschrijving te geven van het probleem.
Ik zou graag een overzicht van scores willen weergeven van verschillende situaties. Een situatie wordt beoordeeld op verschillende criteria, welke horen bij verschillende onderwerpen. Deze link is voor dit geval minder van belang. Als een resultaat is ingevoerd (dit is al functioneel), dan wordt het resultaat opgeslagen in de database als een algeheel resultaat, maar ook per criteria. De structuur van de database die ik gebruik is als volgt:

http://31.186.169.8/~castilio/dbstructuur.JPG

Met behulp van Crisp zijn functie heb ik het volgende voor elkaar gekregen:



Wat ik nou graag zou willen, is een overzicht van resultaten uit de resultaten tabel, van de selectie die je maakt. Zowel voor het moment als de geselecteerde datum (al lijkt me het selecteren van de datum niet zo lastig). Als je klikt op Zaandam, dan zou die alle childrens dus moeten weergeven.
Maar zou je op Ploeg twee van verkoop amsterdam kiezen, dan zou alleen van deze geselecteerde situatie_id een resultaat moeten komen. Hoe zou ik Crisp zijn methode kunnen gebruiken om dit te realiseren? Want het lijkt me niet dat ik een simpele loop kan maken in een recursieve functie die onderliggende children records meeneemt?

TheCrius wijzigde deze reactie 14-11-2011 11:38 (3%)

Falling down is how we grow. Staying down is how we die. --Brian Vaszily


  • NMe
  • Registratie: februari 2004
  • Laatst online: 16:51

NMe

Quia Ego Sic Dico.

Waarom zou dat niet kunnen? Natuurlijk zul je wat moeten herschrijven maar je kan natuurlijk bij elk record dat je ophaalt in de array die je aanmaakt een verwijzing kunnen maken naar zijn parent, en vervolgens tijdens het ophalen van dat record ook bij de parent een verwijzing maken naar het child dat je net toevoegt. Dan kun je ook in je recursieve functie checken of er children zijn en die bij je resultaat optellen waar nodig.

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


  • TheCrius
  • Registratie: mei 2008
  • Laatst online: 18:29
Ik heb nu de volgende code om te kijken wat te scores van het tweede niveau zijn. Op een 3de niveau moet het ook gaan lukken. Hoe zou ik kunnen kijken wat te scores van een niveau 1 zijn? Van alle niveaus onder een parent? Moet dat perse met een recursieve functie? Datum,resultaat en norm strings gebruik ik om via xml een grafiek op te bouwen.
PHP:
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
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
// ophalen sitaties en maken van tree
                        $result = mysql_query(" 
                        SELECT 
                        situatie_id, situatie_parent_id, situatie_naam, situatie_niveau
                        FROM 
                        situatie 
                        WHERE situatie_parent_id = '".$moment."'
                        ORDER BY 
                        situatie_naam ,situatie_parent_id
                        ") or die ( mysql_error () ); 
                            // in array zetten
                            $menuData = array( 
                                'items' => array(), 
                                'parents' => array() 
                            ); 
                        while ($menuItem = mysql_fetch_assoc($result)) 
                        { 
                            $menuData['items'][$menuItem['situatie_id']] = $menuItem; 
                            $menuData['parents'][$menuItem['situatie_parent_id']][] = $menuItem['situatie_id']; 
                        } 
                    
                if($menuData['parents'] == NULL){
                    ############################################
                    # HET NIVEAU IS 3 OF 2 zonder childrens
                    ############################################                
                
                    echo " Geen onderliggende dingen".$moment;
                    
                }else{
                
                    //check wat het wel is
                    $checkhuidig = mysql_query("SELECT * FROM situatie  WHERE situatie_id = '".$moment."'");    
                    $datacheck = mysql_fetch_assoc($checkhuidig);
                    if($datacheck['situatie_niveau'] == 2) { 
                    
                    #########################################################
                    # HET NIVEAU IS 2 => haal alleen het moment en groepen op
                    #########################################################       
                    
                    $q = mysql_query("SELECT *, DATE_FORMAT(resultaat_datum, '%d-%m-%Y') AS resultaat_datum FROM resultaat WHERE situatie_koppel_id IN (" . implode(",", $menuData['parents'][$moment]) . ")  ")or die (mysql_error());
        
                        while($data = mysql_fetch_assoc($q)){
                        
                            echo "ID" .  $data['resultaat_id']  . " " . $data['resultaat_percentage'] . $data['resultaat_datum'] . " <br/>" ;
                            // zet de values achter elkaar
                            $datumstring .= "<category name='".$data['resultaat_datum']."'/>";
                            $resultaatstring .= "<set value='".$data['resultaat_percentage']."'/>";
                            $normstring .= "<set value='".$data['resultaat_norm']."'/>";
                            
                            $result = mysql_query(" 
                            SELECT 
                            situatie_id, situatie_parent_id, situatie_naam, situatie_niveau
                            FROM 
                            situatie 
                            WHERE situatie_parent_id = '".$data['resultaat_id']."'
                            ORDER BY 
                            situatie_naam ,situatie_parent_id
                            
                            ") or die ( mysql_error () ); 
                                // in array zetten
                                $deeper = array( 
                                    'items' => array(), 
                                    'parents' => array() 
                                ); 
                                
                            while ($menuItem = mysql_fetch_assoc($result)) 
                            { 
                                $deeper['items'][$menuItem['situatie_id']] = $menuItem; 
                                $deeper['parents'][$menuItem['situatie_parent_id']][] = $menuItem['situatie_id']; 
                            } 
                            

                            
                            //voor niveau 2 met onderliggende groepen
                            $qs = mysql_query("SELECT * FROM resultaat WHERE situatie_koppel_id IN (" . implode(",", $menuData['parents'][$moment]) . ")  ")or die (mysql_error());
                            
                                while($datadeeper = mysql_fetch_assoc($q)){
                                
                                    $datumstring .= "<category name='".$datadeeper['resultaat_datum']."'/>";    
                                    $resultaatstring .= "<set value='".$datadeeper['resultaat_percentage']."'/>";
                                    $normstring .= "<set value='".$datadeeper['resultaat_norm']."'/>";
                                
                                }
                                
                        }
                    
                    }else{
                    #########################################
                    # HET NIVEAU IS 1 => haal alles op
                    ##########################################

                    echo "niv1";
                    
                    
                    
                    
                    
                    
                    
                    
                    
                    }

TheCrius wijzigde deze reactie 15-11-2011 13:20 (7%)

Falling down is how we grow. Staying down is how we die. --Brian Vaszily


  • NMe
  • Registratie: februari 2004
  • Laatst online: 16:51

NMe

Quia Ego Sic Dico.

(Bijna) alles wat je recursief kan schrijven kun je ook procedureel schrijven, en binnen een afgekaderd probleemdomein is dat meestal zelfs beter. Los daarvan voel ik er eigenlijk weinig voor om honderd regels crappy geformatteerde code door te gaan lezen en je vervolgens op een presenteerblaadje aan te geven wat je precies moet wijzigen. We runnen hier geen helpdesk en ook geen quickfix. Wat was er precies niet duidelijk aan mijn vorige bericht?

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


  • TheCrius
  • Registratie: mei 2008
  • Laatst online: 18:29
Het gedeelte van het maken van een parent en het kijken welke children hier in zitten. Maar prima, snap dat het moeilijk is om dit aan een novice op gebied van arrays en recursie uit te leggen. Zal wel poging doen om het procedureel te schrijven. Toch bedankt.

Falling down is how we grow. Staying down is how we die. --Brian Vaszily

Pagina: 1


Apple iPhone 11 Microsoft Xbox Series X LG OLED C9 Google Pixel 4 CES 2020 Samsung Galaxy S20 Sony PlayStation 5 Nintendo Switch Lite

'14 '15 '16 '17 2018

Tweakers vormt samen met Hardware Info, AutoTrack, Gaspedaal.nl, Nationale Vacaturebank, Intermediair en Independer DPG Online Services B.V.
Alle rechten voorbehouden © 1998 - 2020 Hosting door True