Toon posts:

Join-probleem met 5 tabellen in MySQL

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik heb twee tabellen in een database. Van de tweede tabel zijn er vier 'instanties', dus in totaal heb ik eigenlijk vijf tabellen.

Tabel 1 is shop_tbl_artikel en tabel 2 is shop_tbl_categorie (instanties: shop_tbl_automerk, shop_tbl_autotype, shop_tbl_onderdeeltype, shop_tbl_onderdeelmerk)

Tabel 1 heeft 2 directe verwijzingen naar tabel 2 (naar shop_tbl_autotype en naar shop_tbl_onderdeelmerk), aan de hand van respectievelijk categorieid_1 en categorieid_2. Deze zijn gelinkt aan shop_tbl_categorie.id. Shop_tbl_categorie is op zijn beurt door middel van supercategorieid gelinkt aan een andere 'instantie' van shop_tbl_categorie. shop_tbl_autotype is gelinkt aan shop_tbl_automerk en shop_tbl_onderdeelmerk is gelinkt aan shop_tbl_onderdeeltype.

Nu wil ik een query maken waarmee ik artikelen ophaal, met de bijbehorende 'categorienaam' en 'id' van shop_tbl_automerk, shop_tbl_autotype, shop_tbl_onderdeeltype, shop_tbl_onderdeelmerk en ik wil filteren op shop_tbl_artikel.isaanbieding=0, shop_tbl_automerk.id en shop_tbl_onderdeeltype.id.

Nou heb ik al verschillende dingen geprobeerd met verschillende joins, maar of het werkt niet onder MySQL of er komen te weinig resultaten.

Poging 1:
SELECT shop_tbl_artikel.omschrijving, shop_tbl_categorie_1.categorienaam AS Autotype, shop_tbl_categorie.categorienaam AS Automerk, shop_tbl_categorie.id AS Automerkid, shop_tbl_categorie_3.categorienaam AS Onderdeelmerk, shop_tbl_categorie_2.categorienaam AS Onderdeeltype, shop_tbl_categorie_2.id AS Onderdeeltypeid
FROM ((shop_tbl_artikel LEFT JOIN shop_tbl_categorie AS shop_tbl_categorie_1 ON shop_tbl_artikel.categorieid_1 = shop_tbl_categorie_1.id) LEFT JOIN shop_tbl_categorie ON shop_tbl_categorie_1.supercategorieid = shop_tbl_categorie.id) LEFT JOIN (shop_tbl_categorie AS shop_tbl_categorie_3 LEFT JOIN shop_tbl_categorie AS shop_tbl_categorie_2 ON shop_tbl_categorie_3.supercategorieid = shop_tbl_categorie_2.id) ON shop_tbl_artikel.categorieid_2 = shop_tbl_categorie_3.id
WHERE (((shop_tbl_categorie.id)=344) AND ((shop_tbl_categorie_2.id)=1444));

Poging 2:
SELECT shop_tbl_artikel.id, shop_tbl_artikel.artikelsoortid, shop_tbl_artikel.categorieid_1, shop_tbl_artikel.categorieid_2, shop_tbl_artikel.oenummer, shop_tbl_artikel.artikelnummer, shop_tbl_artikel.brutoprijs, shop_tbl_artikel.omschrijving, shop_tbl_artikel.foto, shop_tbl_artikel.foto_groot, shop_tbl_artikel.bouwjaar, shop_tbl_artikel.isaanbieding, shop_tbl_automerk.id, shop_tbl_automerk.categorienaam AS automerk, shop_tbl_autotype.id, shop_tbl_autotype.categorienaam AS autotype, shop_tbl_onderdeelmerk.id, shop_tbl_onderdeelmerk.categorienaam AS onderdeelmerk, shop_tbl_onderdeeltype.id, shop_tbl_onderdeeltype.categorienaam AS onderdeeltype
FROM shop_tbl_artikel,
shop_tbl_categorie AS shop_tbl_autotype,
shop_tbl_categorie AS shop_tbl_automerk,
shop_tbl_categorie AS shop_tbl_onderdeelmerk,
shop_tbl_categorie AS shop_tbl_onderdeeltype
WHERE
shop_tbl_artikel.categorieid_1 = shop_tbl_autotype.id
AND shop_tbl_autotype.supercategorieid = shop_tbl_automerk.id
AND shop_tbl_artikel.categorieid_2 = shop_tbl_onderdeelmerk.id
AND shop_tbl_onderdeelmerk.supercategorieid = shop_tbl_onderdeeltype.id
AND shop_tbl_automerk.id = '344'
AND shop_tbl_onderdeeltype.id = '1444'
AND isaanbieding = '0'
ORDER BY autotype, shop_tbl_artikel.omschrijving ");

Poging 3:
SELECT shop_tbl_artikel.id, shop_tbl_artikel.artikelsoortid, shop_tbl_artikel.categorieid_1, shop_tbl_artikel.categorieid_2, shop_tbl_artikel.oenummer, shop_tbl_artikel.artikelnummer, shop_tbl_artikel.brutoprijs, shop_tbl_artikel.omschrijving, shop_tbl_artikel.foto, shop_tbl_artikel.foto_groot, shop_tbl_artikel.bouwjaar, shop_tbl_artikel.isaanbieding, shop_tbl_automerk.id, shop_tbl_automerk.categorienaam AS automerk, shop_tbl_autotype.id, shop_tbl_autotype.categorienaam AS autotype, shop_tbl_onderdeelmerk.id, shop_tbl_onderdeelmerk.categorienaam AS onderdeelmerk, shop_tbl_onderdeeltype.id, shop_tbl_onderdeeltype.categorienaam AS onderdeeltype
FROM shop_tbl_artikel
INNER JOIN shop_tbl_categorie AS shop_tbl_autotype ON shop_tbl_artikel.categorieid_1 = shop_tbl_autotype.id
INNER JOIN shop_tbl_categorie AS shop_tbl_automerk ON shop_tbl_autotype.supercategorieid = shop_tbl_automerk.id
INNER JOIN shop_tbl_categorie AS shop_tbl_onderdeelmerk ON shop_tbl_artikel.categorieid_2 = shop_tbl_onderdeelmerk.id
INNER JOIN shop_tbl_categorie AS shop_tbl_onderdeeltype ON shop_tbl_onderdeelmerk.supercategorieid = shop_tbl_onderdeeltype.id
WHERE shop_tbl_automerk.id = '$automerkid' AND shop_tbl_onderdeeltype.id = '$onderdeelid' AND isaanbieding = '0'
ORDER BY autotype, shop_tbl_artikel.omschrijving ");

Help?

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

drm

f0pc0dert

Help?
:D euh... nee? ;)

Ik zou wat aan je ontwerp gaan doen. "Instanties van tabellen" is nou niet bepaald dat je zegt "normaalvorm-ishism". Waarom maak je niet een tabel aan "categoriesoort" en vervolgens maak je 1 koppeltabel waar je een extra veld aan toevoegt die naar de categoriesoort verwijst? Lijkt mij een stukje correcter, zo niet makkelijker te hanteren. Je kunt de categoriesoort_id dan gewoon opnemen in de ON clause van je joins (ON ( ... = .. AND .. = .. ))

Verder heb ik (en velen anderen met mij) niet zo veel trek queries die op zo'n manier staan even door te gaan nemen.

Neem even de tijd die dingen wat leesbaarder neer te zetten, tussen [code]...[/code] tags.

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


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

dusty

Celebrate Life!

en ook even de tijd om de queries leesbaar neer te zetten in de vorm van
code:
1
2
3
4
5
6
7
8
9
10
11
12
select
  iets,
  iets2
from
  tabel1,
  tabel2
where
  tabel1.id=tabel2.id
and
  tabel1.id>5
order by
  tabel1.something

dat is namelijk leesbaarder dan:
select iets, iets2 from tabel1, tabel2 where tabel1.id=tabel2.id and tabel1.id>5 order by tabel1.something

:)

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


  • djluc
  • Registratie: Oktober 2002
  • Laatst online: 24-08 15:45
En misschien afkortingen gebruiken,
code:
1
SELECT * FROM tbl_shop s WHERE s.id=1

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

drm

f0pc0dert

djluc:
En misschien afkortingen gebruiken,
code:
1
SELECT * FROM tbl_shop s WHERE s.id=1

Of misschien niet. Juist in test/debug/ontwikkel fase nooit dergelijke constructies gebruiken. Alleen maar lastig als je een foutmelding krijgt.

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


  • djluc
  • Registratie: Oktober 2002
  • Laatst online: 24-08 15:45
Dan toch echt kortere namen want de kans om met deze namen iets fout te tikken is vrij groot en het is ook nogeens veel meer werk.

Ook vind ik het overzichtelijker, maar dat is natuurlijk gewoon een mening. En het is sneller, maar dat boit in debug-fase niet zoveel.

  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

djluc schreef op 05 februari 2003 @ 17:57:
Dan toch echt kortere namen want de kans om met deze namen iets fout te tikken is vrij groot en het is ook nogeens veel meer werk.

Ook vind ik het overzichtelijker, maar dat is natuurlijk gewoon een mening. En het is sneller, maar dat boit in debug-fase niet zoveel.

Langere namen levert doorgaans een overzichterlijker geheel op.
Vooral als je met meerdere mensen aan iets samen werkt. Je moet natuurlijk uitkijken dat je niet een en ander overdrijft aan lange namen.

Sneller is trouwens maar een heel marginale hoeveelheid, de tijd die een database kwijt is aan het opzetten van een parse-tree is vrij laag tov de totale query-executie tijd.

[ Voor 14% gewijzigd door ACM op 05-02-2003 18:20 ]

Pagina: 1