Join op meerdere tabellen met zelfde kolomnamen:Onderscheid?

Pagina: 1
Acties:

  • KrL
  • Registratie: Oktober 2001
  • Laatst online: 12-08 12:36

KrL

Doe maar duurzaam..

Topicstarter
Ik ben bezig met forum als onderdeel van een community.. Het forum is verdeeld in de volgende hierarchische lagen:

Forum
Category
Topic
Bericht

Forum is de toplaag, onder het forum komt een category te hangen, onder een category een topic en onder een topic een message.. Elke laag is een klasse en
elke klasse is gebaseerd op een basisklasse met onder andere de variabelen id,creator,created_on die worden opgeslagen in de database..

De MySQL tabellen van bovenstaande lagen/klassen zien er zo uit:

forum -> id|creator|created_on|forumname|description
category -> id|creator|created_on|categoryname|description|forum_id
topic -> id|creator|created_on|topictitle|subtitle|category_id
message -> id|creator|created_on|message|topic_id

Nou wil ik dmv een join direct alle waarden uitlezen van alle tabellen tegelijk..

SELECT * FROM message
LEFT JOIN topic
ON message.topic_id=topic.id
LEFT JOIN category
ON topic.category.id=category.id
LEFT JOIN forum
ON category.forum_id=forum.id
WHERE message.id=1;

Als ik dit in PHP door een mysql_query en een mysql_result gooi, hoe kan ik dan onderscheid maken tussen de kolommen van de verschillende tabellen ?

Stel ik doe een while($row = mysql_fetch_array($result) en ik wil de creator van de message hebben dan lukt dit niet want $row['creator'] is altijd gelijk aan de laatste kolom met de naam 'creator' (in dit geval die van forum).. $row['message.creator'] werkt niet.. En met een mysql_fetch_object wordt er ook maar 1 creator aangemaakt, wederom die van forum...

Wie o wie heeft een methode om deze kolommen te onderscheiden ?

Ik had zelf bedacht ze te renamen in de select maar dan moet ik elke individuele kolom noemen in de select (select forum.id as F_ID,forum.creator AS F_creator etc etc).. Dat is niet echt handig..

Verwijderd

Als je met dit databasemodel wil werken zul je de methode toe moeten passen die je zelf aankaart (is sowieso beter (lees: sneller) om elke kolomnaam apart te noemen).

  • EL_Loco
  • Registratie: Oktober 2001
  • Laatst online: 08-11-2023

EL_Loco

alias Haco

select * from message, topic, category, forum
WHERE
messsage.topic_id=topic.topic_id
AND
topic.category_id=category.category_id
AND
category.forum_id=forum.forum_id

zowiets :?
dan kan je gewoon werken met while($row = mysql_fetch_array($result)
$row['forum.forum_id']
zow doe ik dat altijd

(* EL_Loco heeft een hekel aan leftjoins)

rumores non hiatus dremelunt
malleo omnia consentiunt
Lid van het Anti-Jamba front!


Verwijderd

Het is zowiezo beter om alle velden die je wil gebruiken apart vernoemd in je query, dus ik zou gewoon alle kolommen in de select hernoemen mbv "AS".

  • DJ Buzzz
  • Registratie: December 2000
  • Laatst online: 23-08 21:04
select * from message m, topic t, category c, forum f
WHERE
m.topic_id=t.topic_id
AND
t.category_id=c.category_id
AND
c.forum_id=f.forum_id

Zo zou ik het doen. Ik heb mezelf gewoon aangeleerd om gelijk een variabelenaam toe te kennen, dan zit je nooit met dat probleem (ook makkelijker als je 1 tabel met zichzelf wil joinen)

  • DJ Buzzz
  • Registratie: December 2000
  • Laatst online: 23-08 21:04
select * from message m, topic t, category c, forum f
WHERE
m.topic_id=t.id
AND
t.category_id=c.id
AND
c.forum_id=f.id

Zo zou ik het doen. Ik heb mezelf gewoon aangeleerd om gelijk een variabelenaam toe te kennen, dan zit je nooit met dat probleem (ook makkelijker als je 1 tabel met zichzelf wil joinen)

  • cameodski
  • Registratie: Augustus 2002
  • Laatst online: 06-11-2023
Haco schreef op 07 november 2002 @ 08:13:
(* cameodski heeft een hekel aan leftjoins)
* cameodski heeft geen hekel aan left join's, maar wel als ze misbruikt worden.

Never underestimate the power of


Verwijderd

Ik zal wel heel apart zijn ofzo maar ik heb mezelf aangeleerd om de tabelnaam terug te laten komen in de veldnamen. De rest van de naam is zo veel mogelijk standaard (dus altijd user_id i.p.v. dingen als userid, user_id, usid, uid etc. door elkaar).

In jouw geval had ik dus zoiets in elkaar gezet:


forum ->
for_id|for_creator|for_created_on|for_forumname|for_description

category -> cat_id|cat_creator|cat_created_on|cat_categoryname|cat_description|cat_forum_id

topic ->
top_id|top_creator|top_created_on|top_topictitle|top_subtitle|top_category_id

message ->
msg_id|msg_creator|msg_created_on|msg_message|msg_topic_id

(of zoiets :))

Op deze manier voorkom je deze problemen, zijn je queries een stuk duidelijker en je hebt dus altijd unieke veldnamen.

  • cameodski
  • Registratie: Augustus 2002
  • Laatst online: 06-11-2023
Verwijderd schreef op 07 November 2002 @ 13:21:
Ik zal wel heel apart zijn ofzo maar ik heb mezelf aangeleerd om de tabelnaam terug te laten komen in de veldnamen. De rest van de naam is zo veel mogelijk standaard (dus altijd user_id i.p.v. dingen als userid, user_id, usid, uid etc. door elkaar).
Is een mogelijkheid, maar dan moet je wel meer typen en als je veel queries moet schrijven, kan dat vervelend worden.
Ook is het als er veel tabellen zijn nogal moeilijk om logische prefixen te verzinnen. Uit ervaring weet ik dat je op een gegeven ogenblik eigenlijk niets logisch meer kunt verzinnen, waardoor je weer een aparte lijst moet gaan bijhouden waar je alle prefixen terug kunt vinden.

Never underestimate the power of


  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 28-08 12:00

Janoz

Moderator Devschuur®

!litemod

* = evil :)

Als je die * in je select nou gewoon vervangt door de kolomen die je wilt hebben kun je die zelfs nog (mbv as) een duidelijkere naam in de context van deze select geven. Daarnaast staat de volgorde van de teruggegeven kolomen dan vast en zou je simpel met een index kunnen werken.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'

Pagina: 1