[php / mysql] Left join

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • codeweb
  • Registratie: Juni 2002
  • Laatst online: 17-09 16:36
de volgende query wordt uitgevoerd:

PHP:
1
2
Select f.* from forum AS f LEFT JOIN cat As
r on f.cat = r.cid WHERE f.visible = '1' Order by r.id

Als het goed is haalt hij zo een aantal categorieen op, en stopt daar de forums erbij.

Nu heb ik een klein beetje een probleem :p

hoe kan ik dit nu het beste laten weergeven?
het zou er zo moeten komen uit te zien:

-cat1
--forum1
--forum2
-cat2
--forum3

enz...

Acties:
  • 0 Henk 'm!

  • Dido
  • Registratie: Maart 2002
  • Laatst online: 11:58

Dido

heforshe

Je selecteert alleen maar uit f, maar ordered by iets uit r? lijkt me vaag.

code:
1
2
3
4
5
6
7
SELECT f.* 
  FROM forum f 
  LEFT JOIN 
       cat r 
    ON f.cat = r.cid
 WHERE f.visible = '1'
 ORDER BY f.cat, f.forum

Zoiets misschien?
Een apart kopje per categorie gaat met sql niet lukken denk ik.

edit: nou heb ik het wat leesbaarder neergezet, en nou snap ik helemaal niet meer waarom je in hemelsnaam die join op cat doet :?
Wat zit er in welke tabellen? In je voorbeeldlijstje zie ik forum en categorie stan, twee dingen die in forum staan.

Geef eens wat meer uitleg?

Wat betekent mijn avatar?


Acties:
  • 0 Henk 'm!

Verwijderd

Met een simpele state machine is het wel weer te geven. Enige jammere is dat je een beetje onnodig traffic hebt met je MySQL server. Je loopt gewoon over de geretourneerde records en houdt bij wat de laatste categorie was. Als deze wijzigt kun je dus aannemen dat er een nieuw kopje komt.

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<?php

$array = array (
            array ('forum' => 'Forum 1', 'cat' => 1),
            array ('forum' => 'Forum 2', 'cat' => 1),
            array ('forum' => 'Forum 3', 'cat' => 2),
            array ('forum' => 'Forum 4', 'cat' => 3)
);

$lastCat = 0;
foreach ($array as $forumRow)
{
    if ($forumRow['cat'] != $lastCat) {
        echo 'Categorie ', $forumRow['cat'], ")\n";
        $lastCat = $forumRow['cat'];
    }

    echo "\t", $forumRow['forum'], "\n";
}

?>


Geeft:

code:
1
2
3
4
5
6
7
8
$ php test.php
Categorie 1)
        Forum 1
        Forum 2
Categorie 2)
        Forum 3
Categorie 3)
        Forum 4


Het is met deze methode wel belangrijk dat je sorteert op categorie ID!

Acties:
  • 0 Henk 'm!

  • codeweb
  • Registratie: Juni 2002
  • Laatst online: 17-09 16:36
CREATE TABLE cat (
id int(10) NOT NULL auto_increment,
cid int(10) NOT NULL default '0',
pos int(10) NOT NULL default '0',
visible int(10) NOT NULL default '0',
c.name varchar(255) NOT NULL default '',
description varchar(255) NOT NULL default '',
PRIMARY KEY (id)
) TYPE=MyISAM;


CREATE TABLE forum (
id int(10) NOT NULL auto_increment,
lastpost varchar(255) NOT NULL default '',
lastpost_id int(10) NOT NULL default '0',
lastpost_name varchar(255) NOT NULL default '',
subcat int(10) NOT NULL default '0',
visible int(2) NOT NULL default '0',
name varchar(255) NOT NULL default '',
description varchar(255) NOT NULL default '',
pos int(5) NOT NULL default '0',
cat int(5) NOT NULL default '0',
topics varchar(255) NOT NULL default '',
posts varchar(255) NOT NULL default '',
pass varchar(255) NOT NULL default '',
perm_start text NOT NULL,
perm_read text NOT NULL,
perm_reply text NOT NULL,
last_title varchar(255) NOT NULL default '',
sub_canpost int(1) NOT NULL default '0',
PRIMARY KEY (id)
) TYPE=MyISAM;

Dit zijn mijn tabellen

Nu zit er bijvoorbeeld in de tabel cat de volgende gegevens:

id cid pos visible c.name description
1 1 1 1 Cat1 Description1
2 2 2 1 Cat2 Description2

en in de tabel forum zitten de volgende gegevens:

id catid visible name description topics posts
1 1 1 forum1 description1 0 0
2 2 1 forum2 description2 0 0

Zoals je ziet hoort elke forum bij een category uit de andere tabel


hopelijk wordt het zo iets duidelijker

Acties:
  • 0 Henk 'm!

  • Dido
  • Registratie: Maart 2002
  • Laatst online: 11:58

Dido

heforshe

Maar wat je dan wilt is toch gewoon
code:
1
2
3
4
SELECT *
  FROM forum
 WHERE visible = 1
 ORDER BY catid

En dat lijstje kun je dan applicatief wel mooi maken...
Desnoods, als je je categorienaam erbij wilt hebben:
code:
1
2
3
4
5
SELECT c.naam, f.*
  FROM forum f, cat c
 WHERE f.catid = c.cid
   AND f.visible = 1
 ORDER BY catid

?

Wat betekent mijn avatar?


Acties:
  • 0 Henk 'm!

  • codeweb
  • Registratie: Juni 2002
  • Laatst online: 17-09 16:36
ben er na een tijdje prutsen uitgekomen:
onder tussen ook iets andere tabellen gemaakt :)
misschien is het niet de snelste oplossing; maar ik kijk later wel of ik hem kan verbeteren :p

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
$Database->query("SELECT c.catname, f.*  FROM masterbb_forums f, masterbb_cats c 
WHERE f.cat = c.cid AND f.visible = 1 ORDER BY c.pos Desc");
$array = array ();

while($x = $Database->fetch_row())
{
$abcd = array ('forum' => $x['name'], 'cat' => $x['cat'], 'catname' => $x['catname']);
array_unshift($array,$abcd);
}


$lastCat = 0;
foreach ($array as $forumRow)
{
    if ($forumRow['cat'] != $lastCat) {
        echo $forumRow['catname']." " , $forumRow['cat'], ")\n<br>";
        $lastCat = $forumRow['cat'];
    }

    echo "\t", $forumRow['forum'], "\n<br>";
}
Pagina: 1