[MySQL] Tracker met subcategorieen

Pagina: 1
Acties:

  • Nielsz
  • Registratie: Maart 2001
  • Niet online
Heren, ik heb 2 tabellen:

ws_category
-========-
id = het id.
parentid = het kan dus een subcategory zijn. (dus nieuws > shortnieuws oid)
showintracker = moet hij uberhaubt te zien zijn in de tracker?
trackername = de naam die in de tracker te zien is ("latest nieuws");
ordertracker = De order
iShasparentstillbetracker = Als het een subcategory is laten we 'm dan zien als eigen tracker (Y), of moeten deze records te zien zijn als onderdeel van de parent

ws_items
id = het id
CategoryId = ws_category.id
TheText = de inhoud
enz...

Ik wil een aantal trackers laten zien. Daarvoor doe ik eerst:
select
Id,
TrackerName
from
ws_category
where
ShowInTracker = 'Y'
and
(ParentId='0' or
(ParentId<>0 and IfHasParentStillBeTracker='Y'))
order by OrderTracker

Nu krijg ik alle complete trackerid's terug. Nu moet ik dus nog voor elke resultset apart een query maken om de inhoud te laten zien:
select
ws_items.Id,
ws_items.TheText
from
ws_items
where
ws_items.CategoryId = $trackerid limit 0,5

Werkt prima, maar nu krijg ik dus niet de subcategorieen terug. Ik krijg dus echt alleen maar direct 'Nieuws' terug, en geen records uit de subcategory 'Shortnieuws';
Wie kan me wat hints geven :?

  • Nielsz
  • Registratie: Maart 2001
  • Niet online
ik doe nu dit:

$x=SelecteerHeleTrackers();
while()
{
$b=selecteerTrackerUitDeHeleTracker($x);
$a=selecteerItemsMetItemIdIn($b);
}

Maar nu heb ik (n*2)+1 queries nodig om alle trackers te laten zien. Dat moet beter kunnen :(
Iemand hints?

  • Goodielover
  • Registratie: November 2001
  • Laatst online: 18-08 11:34

Goodielover

Only The Best is Good Enough.

Ik neem aan dat je maximale diepte van je categorieen 2 is.
dus maximaal 1 subcategorie, klopt dat?

  • drm
  • Registratie: Februari 2001
  • Laatst online: 09-06-2025

drm

f0pc0dert

hmmm... Wat bedoel je met "tracker"? Een soort boomstructuur :?

Misschien heb je hier wat aan:

1
_______________________________________________
Er is een methode om boomstructuren vast te leggen (ben de naam ff kwijt), die werkt door in een parent aan te geven welke "Range" van children hij heeft:

Parent heeft dan 2 properties extra: firstChildID en lastChildID

Nadeel is dan, dat je de structuur elke keer moet "rehashen" wanneer je een child toevoegt of verwijdert.

2
_______________________________________________
Een andere manier is om gewoon een koppelentiteit aan te brengen, waarin de 2 id's die met elkaar gekoppeld zijn ook meteen aangeven waarvan ze child of parent zijn. Dan laat je dus de relatie tussen categorien en subcategorien puur aan 1 entiteit over, en kun je het geheel eenvoudiger in 1 query vrotten:

tabel catg:
catID PK
name
...

tabel tree:
parentID
childID

Query voor de children:
code:
1
2
3
4
5
6
7
SELECT  (wat je nodig hebt)
FROM      catg   AS parent
LEFT JOIN   tree 
       ON (parent.catID=tree.parentID)
LEFT JOIN   catg   AS children
       ON (tree.childID=children.catID)
WHERE    condities

hth :)

Music is the pleasure the human mind experiences from counting without being aware that it is counting
~ Gottfried Leibniz


  • Nielsz
  • Registratie: Maart 2001
  • Niet online
Spanks all :*
Onder tracker versta ik net als op T.net; de linkerkant, waar de laatste items in staan en de laatste reacties..

Ik heb vannacht zelf nog een andere methode bedacht; in de tabel 'cat' geef ik niet meer aan of het een tracker is en dat soort info.
Ik maak een tabel 'tracker' aan;
t_id
t_name
t_replies_or_item (want ik wil ook de laatste reacties van een item weer kunnen geven, dat was ik ff vergeten :) )
t_cats= " 1,2,3"

Dan begin ik met een simpele query hierop, en dan in een loopje kijk ik of het een replies_or_item is, en doe daarop dan weer een redelijk simpele query "where cats in (1,2,3)";
Dan kan ik dus wel (n)+1 doen, ipv (n*2)+1.

Snappen we het nog?

  • drm
  • Registratie: Februari 2001
  • Laatst online: 09-06-2025

drm

f0pc0dert

Nielsz:
Spanks all :*
Onder tracker versta ik net als op T.net; de linkerkant, waar de laatste items in staan en de laatste reacties..

Ik heb vannacht zelf nog een andere methode bedacht; in de tabel 'cat' geef ik niet meer aan of het een tracker is en dat soort info.
Ik maak een tabel 'tracker' aan;
t_id
t_name
t_replies_or_item (want ik wil ook de laatste reacties van een item weer kunnen geven, dat was ik ff vergeten :) )
t_cats= " 1,2,3"

Dan begin ik met een simpele query hierop, en dan in een loopje kijk ik of het een replies_or_item is, en doe daarop dan weer een redelijk simpele query "where cats in (1,2,3)";
Dan kan ik dus wel (n)+1 doen, ipv (n*2)+1.

Snappen we het nog?
Ik geloof het wel :)
Maar wat is het probleem om dat gewoon in 1 JOIN-query te stoppen :?

Music is the pleasure the human mind experiences from counting without being aware that it is counting
~ Gottfried Leibniz


  • Nielsz
  • Registratie: Maart 2001
  • Niet online
Op donderdag 24 januari 2002 11:13 schreef drm het volgende:

[..]

Ik geloof het wel :)
Maar wat is het probleem om dat gewoon in 1 JOIN-query te stoppen :?
ik was vergeten te vertellen dat ik ook info uit de replietable moet kunnen halen, en dat kan niet (imo) met die join.

  • drm
  • Registratie: Februari 2001
  • Laatst online: 09-06-2025

drm

f0pc0dert

Nielsz:
ik was vergeten te vertellen dat ik ook info uit de replietable moet kunnen halen, en dat kan niet (imo) met die join.
:?
dit kun je toch gewoon als een join erin draaien:
Dan begin ik met een simpele query hierop, en dan in een loopje kijk ik of het een replies_or_item is, en doe daarop dan weer een redelijk simpele query "where cats in (1,2,3)";
Ik volg je geloof ik niet helemaal ... :D

Music is the pleasure the human mind experiences from counting without being aware that it is counting
~ Gottfried Leibniz


  • Nielsz
  • Registratie: Maart 2001
  • Niet online
Op donderdag 24 januari 2002 11:23 schreef drm het volgende:

[..]

:?
dit kun je toch gewoon als een join erin draaien:
[..]

Ik volg je geloof ik niet helemaal ... :D
:)
ik doe bedoel:
code:
1
2
3
4
5
6
7
8
9
10
11
$a= select id,name,cats from ws_tracker
while()
{
new tracker
create title (id, name)
while(select.... where ws_itme.categoryId in ($a.cats))
{
vul een record()
}
close tracker
}

Waar $a.cats = "1,2,3"; nu haalt hij dus de items op die in 1,2 of 3 zitten :)

  • Martijn02
  • Registratie: September 2000
  • Laatst online: 15-09 14:25

Martijn02

/* No Comment */

Wat een rampzalige naamgeving !!!
iShasparentstillbetracker
zelfs als ik er isHasParentStillBeTracker van maak begrijp ik het nog niet :)


Ik maak altijd een tabel category waarmee ik een boomstructuur maak. alle node's met parentID 0 zijn de rootnodes, alle andere hangen daar onder

Category
- ID
- parentID

Item
- ID
- categoryID
- visible (en welke andere waarden je nog wilt)

/edit: ik geloof niet dat ik het helemaal begrepen heb, en tijdens het schrijven van deze reply is het draadje al flink langer geworden, de hierboven geschreven info kan dus min of meer als overbodig beschouwd worden

  • Nielsz
  • Registratie: Maart 2001
  • Niet online
Op donderdag 24 januari 2002 11:46 schreef Martijn02 het volgende:
Wat een rampzalige naamgeving !!!
[..]

zelfs als ik er isHasParentStillBeTracker van maak begrijp ik het nog niet :)


Ik maak altijd een tabel category waarmee ik een boomstructuur maak. alle node's met parentID 0 zijn de rootnodes, alle andere hangen daar onder

Category
- ID
- parentID

Item
- ID
- categoryID
- visible (en welke andere waarden je nog wilt)
Het was dus: "IfHasParentStillBeTracker" (maar dat blijft rampzalig ;)
En die boomstructuur heb ik ook :)
Pagina: 1