[MySQL] Query vraag

Pagina: 1
Acties:
  • 108 views sinds 30-01-2008
  • Reageer

  • B-Man
  • Registratie: Februari 2000
  • Niet online
De situatie is als volgt: ik heb een tabel waarin categorieeën zijn opgeslagen. Iedere categorie kan een parent categorie hebben (dit gaat maximaal een niveau omlaag, dus een child categorie kan zelf geen parent categorie zijn).

Is het mogelijk om met een SQL statement in een keer een listing op te vragen waarin de tabel is geordend als volgt:

parent cat a
child cat d
child cat e
parent cat b
child cat f
child cat g
parent cat c

dus children onder hun resp. parents, en zowel parents als children alfebetisch geordend...

Is dit mogelijk ?

  • Lurge
  • Registratie: Maart 2000
  • Niet online

Lurge

ActueleWind

Dit werkt wel zoals jij dat wilt maar jij gebruikt letters ipv nummers bij mij is het zo als pid==0 dan. is het een tussenkopje (parent) anders een gewoon linkje(child) die verwijst naar een parentid.
beetje vaag uitgelegd maar ik hoop dat je er wat mee kan...
Dit is mijn code. (php)
PHP:
1
2
3
4
5
6
7
8
9
10
<?
$result = mysql_query("SELECT * FROM tuuut ORDER by id", $db_id);
while ($menu = mysql_fetch_array($result)) {
  if($menu[pid]==0){
    echo" parent";
  }elseif($menu[pid]>=0){
    echo "child";  
  }
}
?>

suc6

ActueleWind


  • tomato
  • Registratie: November 1999
  • Niet online
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
SELECT
   PNT.ID,
   CLD.ID AS ChildID
FROM
   Tabel PNT
   LEFT JOIN
    Tabel CLD
    ON
    PNT.ID = CLD.ParentID
WHERE
   PNT.ParentID IS NULL
ORDER BY
   PNT.ID,
   CHLD.ID

Zoiets?

[edit]
Je krijgt hier dus niet de parents als aparte row, maar je krijgt ze in iedere row mee.

  • Lurge
  • Registratie: Maart 2000
  • Niet online

Lurge

ActueleWind

die oplossing van Tomato is dus als je 2 tables hebt die van mij als je er 1 hebt.

ActueleWind


  • tomato
  • Registratie: November 1999
  • Niet online
Op dinsdag 21 augustus 2001 20:04 schreef Lurge het volgende:
die oplossing van Tomato is dus als je 2 tables hebt die van mij als je er 1 hebt.
Nee hoor, ik ging uit van precies 1 tabel.

  • B-Man
  • Registratie: Februari 2000
  • Niet online
tomato: dat is een goed begin...

Ik heb de namen van de categorieeën ook in de tabel staan, en wil mbv deze query een boomstructuur laten zien... Omdat te kunnen doen wil ik dus eigenlijk een query die de parent ook teruggeeft, voordat de children teruggegeven worden.

  • tomato
  • Registratie: November 1999
  • Niet online
Op woensdag 22 augustus 2001 14:55 schreef B-Man het volgende:
Omdat te kunnen doen wil ik dus eigenlijk een query die de parent ook teruggeeft, voordat de children teruggegeven worden.
De parent wordt bij ieder child meegegeven, dus ook bij de eerste. Wat doe je hier verder mee (scripttaal)?

  • B-Man
  • Registratie: Februari 2000
  • Niet online
Zoals ik al zei, ik wil een boomstructuur tekenen. Voor een aantal bomen is de breedte niet begrensd, en gebruik ik daarom een recursieve functie om de gehele boom in een array te laden, en vervolgens het array te gebruiken om de boomstructuur weer te geven.

Maar in dit specifieke geval is de breedte maximaal 2 -dwz een child kan zelf geen parent zijn- en is het (lijkt me) ook mogelijk om dit met een query op te lossen. Om dit in een keer te doen wil ik eigenlijk een resultset als volgt:
code:
1
2
3
4
5
6
parent1 naam
->child1_1 naam
->child1_2 naam
->child1_3 naam
parent2 naam
...etc

Zodat ik de namen van de parents er direct bij heb. Dit is natuurlijk op te lossen door zowel PNT.ID als CNT.ID mee te nemen in de resultset, maar ik ben benieuwd of dat ook gemakkelijker (betrekkelijk ;) ) mogelijk is. Zoals ik hierboven beschreven heb.

(Overigens zit er een klein foutje in je Query: het moet zijn ORDER BY PNT.ID, CLD.ID)

  • B-Man
  • Registratie: Februari 2000
  • Niet online
Voor de geinteresseerden hier even een van de scripts die ik heb voor het weergeven van een boomstructuur (in dit geval de categorie-structuur)
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
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
<?
    /*    Import libraries */
    lib('auth');
    lib('db');

    /* Import variables we need in the script */
    global $cOrder, $x, $rid;

    /* Export variables we need for output */
    global $list, $js, $catSelect;

    /*    Verify the user */
    $A = new auth();
    $A->verify();

    /*    Check if the user is allowed to be here */
    $A->checkPerms(10);

    /*    Get db connection */
    $D = $A->db;

    /*    Add category pop up */
    $js .= "addPopup('category');\n";
    $js .= "addPopupLine('category', 'details', '\"go(\'catDet.php?id=\"+v[0]+\"\')\"');\n";
    if($A->checkPerms(12, true)) {    // Edit a category
    $js .= "addPopupLine('category', 'bewerk', '\"go(\'catEdit.php?id=\"+v[0]+\"\')\"');\n";
    }
    if(empty($rid) || $rid == 0) {
    $js .= "addPopupLine('category', 'startpunt', '\"go(\'catList.php?rid=\"+v[0]+\"&amp;cOrder=$cOrder&amp;x=$x\')\"');\n";
    } else {
    $js .= "addPopupLine('category', 'hele lijst', '\"go(\'catList.php?cOrder=$cOrder&amp;x=$x\')\"');\n";
    }
    if($A->checkPerms(11, true) || $A->checkPerms(16, true)) { // Add pro or cat
    $js .= "addPopupLine('category', 'line');\n";
    }
    if($A->checkPerms(11, true)) {    // Add a category
    $js .= "addPopupLine('category', '+ subcategorie', '\"go(\'catAdd.php?pid=\"+v[0]+\"\')\"');\n";
    }
    if($A->checkPerms(16, true)) {    // Add a product to the current category
    $js .= "addPopupLine('category', '+ produkt', '\"go(\'prodAdd.php?cid=\"+v[0]+\"&amp;exit=prodDet\')\"');\n";
    }
    if($A->checkPerms(14, true)) {    // Move a category
    $js .= "addPopupLine('category', 'line');\n";
    $js .= "addPopupLine('category', 'verplaats', '\"Move(\"+v[0]+\")\"');\n";
    }
    if($A->checkPerms(13, true)) {    // Delete a category
    $js .= "addPopupLine('category', 'line');\n";
    $js .= "addPopupLine('category', 'verwijder', '\"Delete(\"+v[0]+\",\'\"+v[1]+\"\')\"');\n";
    }

    /*    Array containing all categories */
    global $cats;
    $cats = Array();

    /*    Code for sorting the table */
    if(empty($cOrder)) $cOrder = "name";
    if(strlen($x) < 1) $x = 1;
    if($x == 0) { $cOrder .= " desc"; $x = 1; }
    else $x = 0;
    
    function getCat( $A, $cid, $spacing = 0) {
        global $list, $row, $cats, $cOrder;
        $db = $A->db;

        /*    Define row colors */
        $color1 = "#efefef";
        $color2 = "#ffffff";
        
        /*    Get category and child group data from database */
        $category     = $db->query("select * from prod_cat where id=$cid");
        $thisCat     = $db->fetch("a", $category);
        $childCats     = $db->query("select id, pid from prod_cat where pid=$cid order by $cOrder");
        $numProds     = $db->fetch("r", $db->query("select count(id) from prod_list where cid=$cid"));

        /*    Save some cat info to the array */
        $cats[$cid] = $thisCat[name];
        
        /*    Display this category */
        $icon = ($thisCat[visible])?'enabled.gif':'disabled.gif';
        $color = ($row%2 > 0)?$color2:$color1;
        $vis = 'visible';
        $list .= "<tr id=\"row$row\" bgcolor='$color' style='visibility:$vis'>".
                    "<td align=center valign=top>".
                    "[img]'../../images/icons/$icon'[/img]</td>".
                    "<td>";
        if($spacing > 0) {
            if($spacing > 1) {
                $list .= "<img src='../images/lines/blank.gif' align=absmiddle height=16 width=".
                            (($spacing-1) * 18).">";
            }
            $list .= "[img]'../../images/lines/joinbottom.gif'[/img]\n";
        }
        $list .=    "<a href='#' class=listing title=\"$thisCat[description]\" ".
                    "onMouseDown=\"setCurrRow(this);drawPopup(event,'category',Array('$thisCat[id]','$thisCat[name]'))\">".
                    "<font size=2><b>$thisCat[name]</b></font></a>".
                    "</td>".
                    "<td align=center><span>$numProds[0]</span></td>".
                    "<td></td>".
                    "</tr>";
        
        /*    Increment row counter */
        $row++;

        /*    Display it's child categories, if there are any */
        while($child = $db->fetch("a", $childCats)) {
            /*    If so, recursively run this function */
            getCat($A, $child[id], $spacing+1);
        }
    }

    /*    Keep track of the row number for bgColor setting */
    global $row;
    $row = 0;

    /*    Fetch all main parents, starting from $rid */
    if(empty($rid)) {
        $parents = $D->query("select id from prod_cat where pid<1 order by $cOrder");
        while($parent = $D->fetch("a", $parents)) {
            getCat($A, $parent[id]);
        }
    } else {
        getCat($A, $rid);
    }

    /*    Add some JS code for hiding the popup */
    $js .= "document.onmousemove = popupTrackMouse";

    /*    Sort the cat list, and generate a selectbox options */
    natcasesort($cats);
    foreach(array_keys($cats) as $key) {
        $catSelect .= "<option value='$key'>$cats[$key]\n";
    }
?>

Verwijderd

Op dinsdag 21 augustus 2001 19:37 schreef B-Man het volgende:
De situatie is als volgt: ik heb een tabel waarin categorieeën zijn opgeslagen. Iedere categorie kan een parent categorie hebben (dit gaat maximaal een niveau omlaag, dus een child categorie kan zelf geen parent categorie zijn).

Is het mogelijk om met een SQL statement in een keer een listing op te vragen waarin de tabel is geordend als volgt:

parent cat a
child cat d
child cat e
parent cat b
child cat f
child cat g
parent cat c

dus children onder hun resp. parents, en zowel parents als children alfebetisch geordend...

Is dit mogelijk ?
Hier zoek ik dus ook een antwoord op.
Als iemand me hier mee kan helpen zou dat TOP zijn.
dus dit principe :

parent
child
child
parent
child
child

in allemaal rows :) dus zonder de parent steeds mee te geven.

Verwijderd

Niemand :(

  • dusty
  • Registratie: Mei 2000
  • Laatst online: 21-02 00:06

dusty

Celebrate Life!

Op dinsdag 23 oktober 2001 10:11 schreef Dhole het volgende:
Niemand :(
Niet mogelijk. (althans onder MySQL)

Zou je packages of functies kunnen aanmaken en subqueries kunnen gebruiken zou het natuurlijk wel kunnen :)

Back In Black!
"Je moet haar alleen aan de ketting leggen" - MueR


Verwijderd

dan moet het maar anders.
of wachten op Mysql 4.0

  • whoami
  • Registratie: December 2000
  • Laatst online: 22:31
Met een self join kun je dat doen:

tabel lay-out
code:
1
2
3
4
5
6
7
8
9
id  parent-id   name
--  ---------   ----
1    0        parent1
2    0        parent2
3    1        child-par1
4    1        child2-par1
5    0        parent3
6    2        child-par2
7    5        child-par3

en dan met deze SQL query ofzo:
code:
1
2
3
SELECT parent.naam, (SELECT child.naam FROM tabel AS child
           WHERE child.parent_id = parent.id)
FROM tabel AS parent

(heb de query zelf niet uitgeprobeerd maar zou toch op dit moeten lijken;..)

https://fgheysels.github.io/


  • whoami
  • Registratie: December 2000
  • Laatst online: 22:31
Mag hier nu al mijn eigen post niet meer wijzigen zeg...
Wat ik wou zeggen: Wist niet dat MySQL geen subqries ondersteund..

https://fgheysels.github.io/

Pagina: 1