[PHP] Variabelen in categoriën scheiden

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • degoeroe
  • Registratie: Augustus 2001
  • Laatst online: 29-10-2019

degoeroe

Wat hep de goeroe nau gesegt !

Topicstarter
Ik heb al diverse topics doorgespit maar niet het juiste antwoord gevonden. Dit topic komt 't dichtst in de buurt:

Ik ben een website met reistips aan het bouwen. Reistips zijn gekoppeld aan een land en een categorie.

Ik heb 3 tabellen:
rt_land
rt_categorie
rt_tip

Deze tabellen zijn d.m.v. INNER JOIN's gekoppeld. Ik wil graag alleen de per categorie variabelen weergeven. De code hieronder zou al een selectie moeten maken van categorien die bij het desbetreffende land horen en die categorie maar 1 x moeten weergeven. Dus ook al heb ik 3 tips over een categorie zou ik die categorie maar 1 maal moeten zien. Maar ik krijg categorien wel dubbel te zien nu. Waar zit de fout?

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
$cid = $_GET['id']; 

$host="localhost";
$user="user";
$password="pw";

$database_server = mysql_connect($host,$user,$password);  
mysql_select_db("db", $database_server); 
$catQuery = mysql_query("SELECT rt_tip.tip, rt_categorie.id, rt_categorie.categorie
     FROM rt_tip INNER JOIN rt_land ON (rt_tip.land_id = rt_land.id) 
     INNER JOIN rt_categorie ON (rt_tip.categorie_id = rt_categorie.id)
     WHERE rt_land.id='$cid'");
    
    if(mysql_num_rows($catQuery)>0)
    { 
        while($categorien = mysql_fetch_array($catQuery))
        {
        if(isset($show[$categorien['id']]))
            $show[$categorien['id']] = true;            

            { 
        $content .= "<div><b>" . $categorien['categorie'] . "</b><br></div>";
            }
         }
    }
    else
        { 
            $content .= "<div>Er zijn op geen tips beschikbaar</div>"; 
        } 

            include_once('../../template.php');
?>

P IV 2,4 (533) ASUS P4B533, 640Mb PC-2100, 80Gb Maxtor 8Mb cache & 60Gb IBM, 2 x 17" IIyama Prolite X436S-S, Plextor PX-708A, Plextor 52/24/52A, Logitech Marble Mouse USB, GeForce 3 Ti200


Acties:
  • 0 Henk 'm!

  • Dido
  • Registratie: Maart 2002
  • Laatst online: 14:57

Dido

heforshe

Welke tip wil je dan zien, als je er drie bij een categorie hebt? Als je dat niet vermeld, dan gaat mysql dat niet voor je beslissen.

Het kan trouwens zijn dat ik iets mis, maar dit heeft in ieder geval heel veel te maken met je SQL statement, of je php goed gaat weet ik niet.

Voor de duidelijkheid: wat voor relaties liggen er precies tussen de tabellen?

Land 1 - n categorie 1 - n tip neem ik aan?

code:
1
2
3
4
5
    SELECT T.tip, C.id, C.categorie
      FROM rt_tip T
INNER JOIN rt_land L      ON (T.land_id      = L.id) 
INNER JOIN rt_categorie C ON (T.categorie_id = C.id)
     WHERE L.id='$cid'

Bovenstaande query doet precies wat de jouwe doet, en is leesbaar.

Je haalt bij alle categorien die bij een land horen alle tips op. Als je dat niet wilt moet je het niet doen ;)

Ik vraag me trouwens nu echt af wat je datamodel is, want Tip lijkt zowel aan land als categorie gelinkt te zijn, dus liggen je relaties kennelijk als volgt:

Land 1 - n tip
Categorie 1 - n tip

En is er dus geen link tussen land en categorie. Klopt dat?

[ Voor 95% gewijzigd door Dido op 05-10-2006 21:26 ]

Wat betekent mijn avatar?


Acties:
  • 0 Henk 'm!

  • degoeroe
  • Registratie: Augustus 2001
  • Laatst online: 29-10-2019

degoeroe

Wat hep de goeroe nau gesegt !

Topicstarter
Je hebt 't goed gezien dat m'n query uitgebreider is dan m'n output nu. Klopt want zover was ik nog niet. Wilde eerst m'n query op orde hebben en dan stap voor stap m'n output gaan regelen. De relaties zijn als volgt:

[rt_land]
- id
- land

[rt_categorie]
- id
- categorie

[rt_tip]
- id
- land_id
- categorie_id

De id-kolommen zijn gekoppeld met die INNER JOIN's. M'n gepubliceerde code zou er voor moeten zorgen dat ik de categorien waar tips voor bestaan voor dat betreffende land in een div'je netjes onder elkaar krijg (nette opmaak regel ik later, eerst de output fixen).

Maar ik heb dus tips voor maar ik heb dus bijvoorbeeld 'vervooer' tips voor land1 maar ook voor land2. Maar stel dat ik alleen 'Eten & Drinken' tips voor land1 heb maar alle tips wel in 1 tabel. Dan zou ik dus op basis van m'n huidige code maar 1x de categorie 'vervoer' te zien moeten krijgen in m'n categorien overzicht.

Fenks voor je verduidelijking van m'n query. Ziet er 'n stuk beter, overzichtelijker en sneller uit. Dat was de volgende stap geweest (was zover nog niet) maar dit scheelt weer een hoop werk.

Maar zou ik die categorien dan niet op basis van

PHP:
1
2
3
4
5
6
 if(isset($show[$categorien['id']])) 
            $show[$categorien['id']] = true;             

            {  
        $content .= "<div><b>" . $categorien['categorie'] . "</b><br></div>"; 
            }

moeten krijgen?

P IV 2,4 (533) ASUS P4B533, 640Mb PC-2100, 80Gb Maxtor 8Mb cache & 60Gb IBM, 2 x 17" IIyama Prolite X436S-S, Plextor PX-708A, Plextor 52/24/52A, Logitech Marble Mouse USB, GeForce 3 Ti200


Acties:
  • 0 Henk 'm!

  • Dido
  • Registratie: Maart 2002
  • Laatst online: 14:57

Dido

heforshe

Degoeroe schreef op donderdag 05 oktober 2006 @ 21:52:
M'n gepubliceerde code zou er voor moeten zorgen dat ik de categorien waar tips voor bestaan voor dat betreffende land in een div'je netjes onder elkaar krijg (nette opmaak regel ik later, eerst de output fixen).
Dat is wel te doen met een correcte SQL-query, kom ik zo op terug.
Maar zou ik die categorien dan niet op basis van [knip] moeten krijgen?
Geen idee, maar waarom zou je ze eerst in veelvoud ophalen om ze dan applicatief te filteren?

Je wilt voor het gegeven land alle categorien waar tips voor bestaan. Dan wil je dus je tips zelf al niet selecteren, want je wilt geen tips maar categorien. Al je informatie staat in je tabel rt_tip, behalve je categoriebeschrijving. Joinen op rt_land is dus al niet nodig.
code:
1
2
3
4
5
    SELECT C.id, C.categorie
      FROM rt_tip T
INNER JOIN rt_categorie C ON (T.categorie_id = C.id)
     WHERE T.landLid='$cid'
  GROUP BY C.id, C.categorie

Tenzij ik me heel sterk vergis krijg je nu gewoon al je categorien waar records voor bestaan in rt_tip en waar in rt_tip ook het juiste land staat. De group by zorgt ervoor dat je ze maar 1 keer krijgt.

tip: Als je wilt tonen hoeveel tips er zijn in iedere categorie voeg je in je select een COUNT(*) toe.

Wat betekent mijn avatar?


Acties:
  • 0 Henk 'm!

  • degoeroe
  • Registratie: Augustus 2001
  • Laatst online: 29-10-2019

degoeroe

Wat hep de goeroe nau gesegt !

Topicstarter
Top bedankt, ga het direct proberen

P IV 2,4 (533) ASUS P4B533, 640Mb PC-2100, 80Gb Maxtor 8Mb cache & 60Gb IBM, 2 x 17" IIyama Prolite X436S-S, Plextor PX-708A, Plextor 52/24/52A, Logitech Marble Mouse USB, GeForce 3 Ti200