[SQL] Probleem met tabel dubbel benaderen *

Pagina: 1
Acties:

  • Kaastosti
  • Registratie: Juni 2000
  • Laatst online: 06-05 09:01

Kaastosti

Vrolijkheid alom!

Topicstarter
Het klinkt echt heel stom, maar ik zit al 1.5 uur te puzzelen en knutselen over hoe ik een bepaalde waarde uit de database kan toveren. Misschien mis ik een crusiale functie van SQL waarmee het standaard makkelijk kan, maar ik wordt helemaal leip :)

Hieronder een uitleg van hoe de situatie is en wat ik wil bereiken. Ik heb de tabellen zo uitgedund (of is dat met een t?) dat alleen de relevante velden hier staan.
[b]domains[/b]:  domain_id, domain_name
[b]packages[/b]: cp_id, parent_cp_id
[b]accounts[/b]: cp_id, domain_id

Ik stop er in: domain_id
Ik wil er uit: domain_name van de domeinen die het domein met het ingevoerde domain_id als 'parent'-domein hebben.
Ofwel: Via het ingevoerde domain_id weet ik uit accounts het cp_id van het parent-domein. Dat cp_id moet gelijk zijn aal de parent_cp_id uit packages. Het cp_id uit dat record (wat anders is dan het cp_id uit de vorige zin), moet ik 'invoeren' in accounts, om daarna uit die tabel het domain_id te vinden die weer behoord bij dit laatste cp_id (van het child-domein). Dat id kan ik vervolgens invullen in de domains tabel, waarna ik de domain_name kan opvragen.

Een heel verhaal en ik had in m'n creativiteit de volgende functie geprobeerd in uiterste wanhoop:
SELECT d.domain_name
FROM domains AS d,
	package AS p,
	accounts AS a,
	accounts AS a2
WHERE a.domain_id = '<int>'
	AND a.cp_id = p.parent_cp_id
	AND p.cp_id = a2.cp_id
	AND a2.domain_id = d.domain_id

Ik weet uberhaupt niet of hij het leuk vindt dat ik eenzelfde tabel 2 keer noem en een andere alias geef, maar als ik de query in phpMyAdmin zet, geeft deze geen foutmelding terug. Kennelijk is de syntax wel ok, maar hij returned gewoon 0 records, ook al zouden dat er een aantal moeten zijn.

Een vergissing is menselijk, maar om er echt een puinhoop van te maken heb je een computer nodig.


  • gorgi_19
  • Registratie: Mei 2002
  • Nu online

gorgi_19

Kruimeltjes zijn weer op :9

Geef even een fatsoenlijke titel, als je wilt :) "Ik kom niet uit een query" is niet echt probleembeschrijvend te noemen :)

Digitaal onderwijsmateriaal, leermateriaal voor hbo


  • sig69
  • Registratie: Mei 2002
  • Laatst online: 22:24
Jaja.. Ik snap er eerlijk gezegd geen hol van. Kan je niet ff een plaatje van je tabellen en relaties posten? (Een plaatje zegt meer dan 1000 woorden...)

Roomba E5 te koop


  • stp_4
  • Registratie: Maart 2003
  • Laatst online: 30-04 19:47
Kijk eens naar JOIN.....

stp - PSN ID: stp_4


  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 06-05 18:51

Creepy

Tactical Espionage Splatterer

Hij gebruikt al een JOIN, alhoewel niet specifiek met een JOIN keyword gedefinieerd. ;)

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


  • Kaastosti
  • Registratie: Juni 2000
  • Laatst online: 06-05 09:01

Kaastosti

Vrolijkheid alom!

Topicstarter
Geef even een fatsoenlijke titel
Ook hier heb ik over gedacht, maar anders kon ik het niet omschrijven. Tenminste, niet zonder het hele verhaal in de titel te zetten ;)
"Probleem met tabel dubbel benaderen" misschien, want dat is waar het uiteindelijk op stokt.

Een plaatje zegt vaak meer, maar in dit geval niet echt, aangezien het een 'simpele' MySQL database is. Relaties zijn er dus simpelweg niet, behalve misschien softwarematig dat een aantal waarden hetzelfde behoren te zijn. Het komt er heel simpel op neer dat de drie tabellen in de startpost de enige zijn die informatie bevatten waar ik wat mee kan.

Alle gegevens zijn id nummers, op domain_name na uiteraard. Het is dus 1 grote kluwe getalletjes waar ik me een weg doorheen probeer te worstelen :)
Kijk eens naar JOIN.....
Degene die het programmeerwerk in eerste instantie heeft gedaan, was nogal verzot op JOINs, vooral als hij maar veel "SELECT *" mocht gebruiken. Dat werden tabellen van de halve database aan gegevens waar uiteindelijk 3 velden van gebruikt werden en 5 minuten duurden.

Door meerdere tabellen op te geven gebruik ik al een INNER JOIN, wat Creepy zegt.

[ Voor 24% gewijzigd door Kaastosti op 04-05-2005 17:47 . Reden: Typo enzo ]

Een vergissing is menselijk, maar om er echt een puinhoop van te maken heb je een computer nodig.


  • stp_4
  • Registratie: Maart 2003
  • Laatst online: 30-04 19:47
Creepy schreef op woensdag 04 mei 2005 @ 17:42:
[...]

Hij gebruikt al een JOIN, alhoewel niet specifiek met een JOIN keyword gedefinieerd. ;)
Dan zou ik persoonlijk toch liever JOIN gebruiken omdat het voor mij meer inzicht geeft wat je nu eigenlijk aan het doen bent.

stp - PSN ID: stp_4


  • Kaastosti
  • Registratie: Juni 2000
  • Laatst online: 06-05 09:01

Kaastosti

Vrolijkheid alom!

Topicstarter
Hmmm als ik het probeer te benoemen in JOINs raak ik alweer helemaal de weg kwijt :P

[b]domains[/b]
domain_id domain_name
1         tralala.nl
2         woei.be
3         gnuk.com
4         blaat.co.uk

[b]packages[/b]
cp_id     parent_cp_id
1         0
2         0
3         2
4         2

[b]accounts[/b]
cp_id     domain_id
1         1
2         2
3         3
4         4

Als de tabellen er zo uit zouden zien, zou dat inhouden dat de domeinen gnuk.com en blaat.co.uk aliases zijn voor woei.be. Dat wordt aangegeven in de packages tabel, waar wordt gezet dat cp_id's 3 en 4 onderdeel zijn van cp_id 2. Dat is ook domain_id 2, welke dus woei.be is.

In het bovenstaande geval wil ik met mijn query de namen 'gnuk.com' en 'blaat.co.uk' er uit krijgen als resultset.

[ Voor 88% gewijzigd door Kaastosti op 04-05-2005 17:55 ]

Een vergissing is menselijk, maar om er echt een puinhoop van te maken heb je een computer nodig.


  • stp_4
  • Registratie: Maart 2003
  • Laatst online: 30-04 19:47
SQL:
1
2
3
4
5
6
7
8
9
10
11
12
SELECT 
  domain_name from domain 
INNER JOIN 
  packages 
ON 
  parent_cp_id = domain_id 
INNER JOIN 
  accounts 
ON 
  accounts.cp_id = packages.cp_id 
WHERE 
  packages.parent_cp_id = 2


Zoiets? heb hem ff snel in elkaar getrapt en niet getest... Ik twijfel trouwen over je tabel structuur maar laten we het dan maar even bij die query laten.. moet even kijken of er geen left joins van gemaakt moeten worden..

[ Voor 16% gewijzigd door stp_4 op 04-05-2005 20:05 ]

stp - PSN ID: stp_4


  • Mike Jarod
  • Registratie: Januari 2002
  • Niet online
Volgens mij is dit 'm, mits je database subqueries aankan :)

select 
	domains.domain_name
from
	domains
,	accounts
where	
	domains.domain_id = accounts.domain_id
and	accounts.cp_id in
	(
		select
			packages.cp_id
		from
			packages
		,	accounts
		where
			accounts.cp_id = packages.parent_cp_id
		and	accounts.domain_id = [invoer]
	)

  • Kaastosti
  • Registratie: Juni 2000
  • Laatst online: 06-05 09:01

Kaastosti

Vrolijkheid alom!

Topicstarter
Zoiets? heb hem ff snel in elkaar getrapt en niet getest
domain_id is dus niet hetzelfde als een cp_id :)

Die van Mike zou 'm nog kunnen zijn, maar dat sub-query gedeelte ben ik nog niet zo zeker van :P

Een vergissing is menselijk, maar om er echt een puinhoop van te maken heb je een computer nodig.


  • stp_4
  • Registratie: Maart 2003
  • Laatst online: 30-04 19:47
Kaastosti schreef op woensdag 04 mei 2005 @ 20:30:
[...]
domain_id is dus niet hetzelfde als een cp_id :)
Die van Mike zou 'm nog kunnen zijn, maar dat sub-query gedeelte ben ik nog niet zo zeker van :P
Sorry foutje

Deze dan?
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
SELECT
    domains.domain_name
FROM
    packages
INNER JOIN
    accounts
ON
    accounts.cp_id = packages.cp_id
INNER JOIN
    domains
ON
    domains.domain_id  = accounts.domain_id
WHERE
    packages.parent_cp_id = 2

[ Voor 4% gewijzigd door stp_4 op 04-05-2005 23:52 ]

stp - PSN ID: stp_4


  • Lustucru
  • Registratie: Januari 2004
  • Niet online

Lustucru

26 03 2016

Ik zie niets fout aan je query en als ik hem uitprobeer geeft ie het goede resultaat, nadat ik de typo package[s] as p eruit gehaald heb. :?

De oever waar we niet zijn noemen wij de overkant / Die wordt dan deze kant zodra we daar zijn aangeland


Verwijderd

Ik denk dat het beter te begrijpen is als er een LEFT [OUTER] JOIN van gemaakt wordt,
code:
1
2
3
4
5
SELECT domains.domain_id, domains.domain_name
FROM packages
LEFT JOIN accounts ON accounts.cp_id = packages.cp_id
LEFT JOIN domains ON domains.domain_id  = accounts.domain_id
WHERE packages.parent_cp_id = 2

  • Kaastosti
  • Registratie: Juni 2000
  • Laatst online: 06-05 09:01

Kaastosti

Vrolijkheid alom!

Topicstarter
De gein is nu alleen dat ik de parent_cp_id niet weet, maar de domain_id van het 'parent'-domein. Wat er dus in de query moet gebeuren is dat ik dat domain_id invoer, daar de cp_id bij vindt en die zeg maar in bovenstaande query zet bij "WHERE packages.parent_cp_id= ... ".

Een vergissing is menselijk, maar om er echt een puinhoop van te maken heb je een computer nodig.


  • Mike Jarod
  • Registratie: Januari 2002
  • Niet online
Zeg ehm, heb je zelf al eens iets geprobeerd :?

Het lijkt mij er op dat je net zo lang zit te wachten totdat iemand je de correcte query geeft, je geeft niet eens feedback of een gegeven query werkt of niet.

Je hebt nu toch wel al heel wat tips/ideeen gekregen :)

  • stp_4
  • Registratie: Maart 2003
  • Laatst online: 30-04 19:47
Mike Jarod schreef op donderdag 05 mei 2005 @ 17:59:
Zeg ehm, heb je zelf al eens iets geprobeerd :?

Het lijkt mij er op dat je net zo lang zit te wachten totdat iemand je de correcte query geeft, je geeft niet eens feedback of een gegeven query werkt of niet.

Je hebt nu toch wel al heel wat tips/ideeen gekregen :)
Ik wilde net zeggen ja, deze query geeft het result dat je wilde hebben. Misschien inderdaad nuttig om hier nu zelf op voort te borduren. Mochten bepaalde dingen dan nog niet lukken, vermeld het dan maar weer maar wel met een duidelijke probleemomschrijving.

stp - PSN ID: stp_4


  • Kaastosti
  • Registratie: Juni 2000
  • Laatst online: 06-05 09:01

Kaastosti

Vrolijkheid alom!

Topicstarter
Yup je hebt gelijk, laat ik eerst een aan de slag gaan met de info die ik nu heb... ik kon alleen gisteren niet bij m'n werk, dus het 'testen' moest ik even uit m'n hoofd doen. Bedankt voor de hulp en informatie, ik ga verder aan de slag :)

Beetje jammer... mysql die hier draait is 4.0.24, en subselects werken pas vanaf 4.1... misschien toch maar upgraden :P

[ Voor 25% gewijzigd door Kaastosti op 06-05-2005 12:01 ]

Een vergissing is menselijk, maar om er echt een puinhoop van te maken heb je een computer nodig.

Pagina: 1