[MySQL] - Query met JOIN?!

Pagina: 1
Acties:

  • gvanh
  • Registratie: April 2003
  • Laatst online: 02-12-2023

gvanh

Webdeveloper

Topicstarter
Hallo!

Momenteel heb ik een database tabel die er ongeveer zo uitziet:

code:
1
2
3
4
5
cms_objectID    int(11)
parentID    int(11)
lft             int(11)
rgt             int(11)
is_linkable     tinyint(2)


Hierbij worden "lft" en "rgt" gebruikt voor het aangeven van een boom-structuur in de objecten onderling.

Nu wil ik graag één enkele query, waarin ik alle objecten uit de database haal, die voor het veld "is_linkable" als waarde "1" hebben, en alle PARENT objecten. Dat wil in dit geval zeggen: alle objecten waarvoor geld dat lft kleiner en rgt groter is dan de CHILD, waarvoor geldt is_linkable=1.

Ik ben inmiddels ongeveer anderhalf uur bezig met het proberen van de meest uiteenlopende queries ... maar ik kom er helaas niet uit. Ik heb bijvoorbeeld zoiets geprobeerd:

code:
1
2
3
4
SELECT  DISTINCT b.cms_objectID AS bID, a.*, b.lft, b.rgt
FROM cms_objects AS a, cms_objects AS b
RIGHT JOIN cms_objects ON a.lft < b.lft AND a.rgt > b.rgt
WHERE a.is_linkable =1 OR (a.lft < b.lft AND a.rgt > b.rgt)


Ik hoop heel erg dat iemand mij uit de brand kan helpen ... alvast enorm bedankt!

  • Gods Lonely Man
  • Registratie: April 2002
  • Laatst online: 19-02-2024

Gods Lonely Man

A sidekick's sidekick

als je er van maakt iets als
code:
1
2
3
SELECT lft, rgt 
FROM objects 
WHERE is_linkable = 1

en dan met behulpt van die uitkomst:
code:
1
2
3
SELECT * 
FROM cms_objects 
WHERE  lft BETWEEN value_lft AND value_rgt


of hetzelfde alleen dan met een subquery?

It was that kind of a crazy afternoon, terrifically cold, and no sun out or anything, and you felt like you were disappearing every time you crossed a road.

If it weren't for Carbon-14, I wouldn't date at all.


  • gvanh
  • Registratie: April 2003
  • Laatst online: 02-12-2023

gvanh

Webdeveloper

Topicstarter
Dat kan wel ... maar aangezien er potentieel heel veel objecten worden gevonden die voldoen aan het criterium "is_linkable = 1", moet ik dus dan ook heel veel nieuwe queries maken op basis van de gevonden resulaten. Bovendien moet ik daarna dan nog eens in PHP alle dubbele PARENTS uit de resultaten halen.

Al met al niet erg efficiënt ... vandaar dat ik erg graag de hele result-set in één query wil proberen te vangen.

Wel bedankt voor het meedenken!

  • Morrar
  • Registratie: Juni 2002
  • Laatst online: 15-05 19:40
Volgens mij is wat jij wilt niet mogelijk met een JOIN-statement. Met een JOIN kun je de gegevens van 2 of meer tabellen koppelen aan 1 (!) resultaat in de resultset.

Wat jij wilt is eerst een resultset opbouwen op basis van "is_linkable" en vervolgens op basis van deze resultset resultaten gaan toevoegen (!). Dat kan imho niet met een JOIN, maar correct me if I'm wrong...

Je hebt dus meerdere queries nodig...

[ Voor 9% gewijzigd door Morrar op 01-12-2004 17:27 ]


  • gvanh
  • Registratie: April 2003
  • Laatst online: 02-12-2023

gvanh

Webdeveloper

Topicstarter
Maar dit soort queries zullen toch wel vaker voor komen?

Of is dat geen geldig argument? :P

Het wordt zo'n enorme mijl-op-zeven als dit niet in één query kan ... dan word ik echt heel ongelukkig. :'(

  • StevenK
  • Registratie: Februari 2001
  • Laatst online: 22:22
gvanh schreef op woensdag 01 december 2004 @ 16:06:
Hallo!

Momenteel heb ik een database tabel die er ongeveer zo uitziet:

code:
1
2
3
4
5
cms_objectID    int(11)
parentID    int(11)
lft             int(11)
rgt             int(11)
is_linkable     tinyint(2)


Hierbij worden "lft" en "rgt" gebruikt voor het aangeven van een boom-structuur in de objecten onderling.

Nu wil ik graag één enkele query, waarin ik alle objecten uit de database haal, die voor het veld "is_linkable" als waarde "1" hebben, en alle PARENT objecten. Dat wil in dit geval zeggen: alle objecten waarvoor geld dat lft kleiner en rgt groter is dan de CHILD, waarvoor geldt is_linkable=1.

Ik ben inmiddels ongeveer anderhalf uur bezig met het proberen van de meest uiteenlopende queries ... maar ik kom er helaas niet uit. Ik heb bijvoorbeeld zoiets geprobeerd:

code:
1
2
3
4
SELECT  DISTINCT b.cms_objectID AS bID, a.*, b.lft, b.rgt
FROM cms_objects AS a, cms_objects AS b
RIGHT JOIN cms_objects ON a.lft < b.lft AND a.rgt > b.rgt
WHERE a.is_linkable =1 OR (a.lft < b.lft AND a.rgt > b.rgt)


Ik hoop heel erg dat iemand mij uit de brand kan helpen ... alvast enorm bedankt!
En wat gebeurt er dan als je dit probeert ?

Was advocaat maar vindt het juridische nog steeds leuk. Doet tegenwoordig iets in de metaal.


  • gvanh
  • Registratie: April 2003
  • Laatst online: 02-12-2023

gvanh

Webdeveloper

Topicstarter
In dat specifieke geval krijg ik alle top-level nodes heel vaak terug ... god knows why ...

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

drm

f0pc0dert

gvanh:
code:
1
2
3
4
SELECT  DISTINCT b.cms_objectID AS bID, a.*, b.lft, b.rgt
FROM cms_objects AS a, cms_objects AS b
RIGHT JOIN cms_objects ON a.lft < b.lft AND a.rgt > b.rgt
WHERE a.is_linkable =1 OR (a.lft < b.lft AND a.rgt > b.rgt)
Twee vragen:
[list=1]• Waarom gebruik je een RIGHT JOIN?
• Ben je je er van bewust dat als je de conditie die je in de ON clause legt ook in de WHERE clause legt je alsnog een "INNER" JOIN forceert (een zgn. equi join)?

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


  • gvanh
  • Registratie: April 2003
  • Laatst online: 02-12-2023

gvanh

Webdeveloper

Topicstarter
drm schreef op woensdag 01 december 2004 @ 18:38:
[...]
Twee vragen:
[list=1]• Waarom gebruik je een RIGHT JOIN?
• Ben je je er van bewust dat als je de conditie die je in de ON clause legt ook in de WHERE clause legt je alsnog een "INNER" JOIN forceert (een zgn. equi join)?
  1. In dit geval waarschijnlijk, omdat de LEFT JOIN en INNER JOIN ook niet werkte.
  2. Nee 8)7
Ergo: Dit is één van de ongeveer 10.000 queries, die ik heb geprobeerd in de hoop om met Trial en Error (met een scheef oog loerend naar de MySQL manual en de daar gegeven voorbeelden) tot het gewenste resultaat te komen.

Helaas dus zonder succes.

  • Grijze Vos
  • Registratie: December 2002
  • Laatst online: 21-02 23:50
Welke MySQL versie heb je? Ik wil best even meedenken, maar dan wil ik wel weten of ik subqueries e.d. kan gebruiken. ;)

Op zoek naar een nieuwe collega, .NET webdev, voornamelijk productontwikkeling. DM voor meer info


  • gvanh
  • Registratie: April 2003
  • Laatst online: 02-12-2023

gvanh

Webdeveloper

Topicstarter
Ja, da's het vervelende ... zelf draai ik wel 4.0.12 ... maar op de webserver van m'n provider draait voorlopig nog 3.23 ... so far for subqueries ... :'(

  • Grijze Vos
  • Registratie: December 2002
  • Laatst online: 21-02 23:50
Kun je ergens een dump van deze tabel geven, plus inhoud? Dan is het wat makkelijker "kutten". ;)

Op zoek naar een nieuwe collega, .NET webdev, voornamelijk productontwikkeling. DM voor meer info


  • gvanh
  • Registratie: April 2003
  • Laatst online: 02-12-2023

gvanh

Webdeveloper

Topicstarter
http://www.thirdwave.nl/cms_objects.sql

Bij deze ... er komen dan wel een hoop (in dit geval niet relevante) velden bij ... maar ik neem aan dat dat niet zo'n enorm probleem is.

Alvast weer veel dank voor alle moeite!

  • Morrar
  • Registratie: Juni 2002
  • Laatst online: 15-05 19:40
Beetje off-topic, maar waarom "flikker" je alles in 1 tabel? Ik ben/was zelf ook een tijdje bezig geweest met een eigen CMS en daarin maakte ik een onderscheid tussen "secties" en objecten. De secties-tabel was geordend op ID en ParentID en bleef redelijk klein. Ik haalde die tabel in 1x op met PHP (kan ook evt. in delen) en maakte er dan een tree mee ala:

Fotografie
-- Analoog
-- Digitaal
Webdesign
-- Javascript
-- PHP
etc.

Dat draaide redelijk efficient. De objecten hadden vervolgens allemaal hun eigen tabellen, 1 tabel voor ieder type (file, image, html-page, shortcut naar object, user defined). De objecten waren gekoppeld aan een sectie.

Misschien een idee? Volgens mij blijft alles dan wat overzichtelijker...

[ Voor 5% gewijzigd door Morrar op 02-12-2004 01:15 ]


  • gvanh
  • Registratie: April 2003
  • Laatst online: 02-12-2023

gvanh

Webdeveloper

Topicstarter
Naast deze "cms_objecten" heb ik inderdaad ook de verschillende specifieke objecten. De specifieke objecten zijn - zoals jij al beschrijft - een soort 'extensies' van het algemene object. Wat er in de cms_objects tabel staat zijn de eigenschappen die alle objecten gemeen hebben. Het lijkt me onzin om eigenschappen die bij ALLE objecten voorkomen, in elk van de specifieke tabellen neer te zetten.

Toch?

  • Morrar
  • Registratie: Juni 2002
  • Laatst online: 15-05 19:40
Nee idd dat is inderdaad niet nodig. Maar mijn ount is meer dat je de navigatie los haalt van de objecten. De navigatie (de "secties" van de website in mijn CMS) heb je vaak nodig en heeft een hierarchische structuur. Daar moet je dus dit soort lastige queries op loslaten. Daarom heb ik die persoonlijk liever in een aparte tabel zodat je er efficienter me kunt werken...
Pagina: 1