[SQL] Moeilijk doen

Pagina: 1
Acties:

  • maartenvdv737
  • Registratie: Augustus 2000
  • Laatst online: 17-08 15:34
Ik ben waarschijnlijk weer moeilijk aan het doen met een query, maar ik zie geen andere uitweg.

Wat wil ik:

- uit t1 alles selecteren
- m.b.v. t2 alles wat zowel in t1 als in t2 staat een extra 'selected' veld meegeven.

Dit om een html LIST te kunnen opbouwen en aan de hand van een 2e tabel zien welke list-items al geselecteerd zijn.

Daar komt nog bij dat die lijst ook nog verschillend is voor verschillende groepen, aangegeven door $id.

Wat heb ik nu:

code:
1
2
3
4
SELECT t1.id, IF ( t1.id = t2.id,  'selected',  '' ) AS selected
FROM t1
LEFT  JOIN t2 ON t2.id= t1.id
WHERE  (t1.groepID = $id OR   t2.groepID IS NULL)


Weet iemand hoe dit moet? Ik heb de JOIN manual nog weer een keer doorgenomen, maar volgens mij zit ik gewoon op het verkeerde spoor..

Ik blijf er iig vrij nuchter onder....


  • marty
  • Registratie: Augustus 2002
  • Laatst online: 27-03-2023
maartenvdv schreef op 14 September 2003 @ 22:29:
Wat wil ik:

- uit t1 alles selecteren
- m.b.v. t2 alles wat zowel in t1 als in t2 staat een extra 'selected' veld meegeven.
even afgezien van je query (wat is trouwens het resultaat van je huidige?), weet je zeker dat je database ontwerp wel goed is en dat dit niet gewoon in 1 tabel kan? geef er anders eens iets meer uitleg bij waarom je het zo heb zoals je het heb

  • maartenvdv737
  • Registratie: Augustus 2000
  • Laatst online: 17-08 15:34
Over mijn database model.

Het bovenstaande is een simplificatie, dit zijn de substituties:

t1 is de tabel: shop_categorie
t2 is de tabel: shop_groep_categorien (dit is een relatie tabel tussen shop_groepen en shop_categorie)

Voor het overzicht, hier een schema: http://81.173.4.20/db.html

Ik heb geprobeerd alles zo goed mogelijk te normaliseren. Er staat nu geen dubbele data in mijn ontwerp. Dit komt in dit geval echter niet ten goede van de eenvoud. Als ik de categorieID bijvoorbeeld bij de tabel shop_groepen inzet, of de groepID bij de tabel shop_categorien, dan heb ik erg veel dubbele data, omdat sommige groepen tot meerdere categorien kunnen behoren.


Mijn originele query is:
code:
1
2
3
4
5
6
7
8
9
SELECT shop_categorie.id, shop_groep_categorien.categorieID, naam, 
IF (
shop_categorie.id = shop_groep_categorien.categorieID, 'selected', ''
) AS selected
FROM shop_categorie
LEFT JOIN shop_groep_categorien ON shop_groep_categorien.categorieID = shop_categorie.id
WHERE (
shop_groep_categorien.groepID = 1 OR shop_groep_categorien.groepID IS NULL 
)


Ik kan moeilijk zeggen wat deze query doet, hij geeft namelijk voor de groepen die iets in shop_groep_categorien hebben staan wel wat terug, maar voor de rest van de groepen niet, tenzij shop_groep_categorien helemaal leeg is.

Ik kan wel zeggen wat hij zou moeten doen:

In shop_categorien staan alle categorien, die wil ik selecteren zodat ik er een list van kan maken.
Met behulp van shop_groep_categorien weet ik welke categorien al behoren tot een bepaalde groep, en welke niet. Degene die daaar wel toe horen wil ik een veld: 'selected' meegeven, en die daar niet toe horen een veld: ''


Het probleem is volgens mij dat ik niet EN kan selecteren op shop_groep_categorien.groepID = $id EN alle groepen doorlaten die wel in shop_categorie, maar niet in shop_groep_categorien.


Ik wil hier echter wel graag iets op vinden, want ik heb straks hetzelfde probleem met de producten, die moeten weer in relatie staan tot de groepen.

[ Voor 28% gewijzigd door maartenvdv737 op 15-09-2003 09:32 ]

Ik blijf er iig vrij nuchter onder....


  • maartenvdv737
  • Registratie: Augustus 2000
  • Laatst online: 17-08 15:34
Voor wie het bovenstaande verhaal een beetje te complex wordt, ik heb eigenlijk een veel algemenere vraag bedacht:

HOE kan ik 2 tabellen "samenvoegen" en met een WHERE een restrictie leggen op slechts 1 van die 2 tabellen.

Zodat de 1e tabel in zijn geheel wordt geselecteerd, en de 2e afhankelijk van de restrictie.


Moet dit met een cross-join? Heb ik geprobeerd namelijk, maar als 1 van de 2 tabellen dan leeg is, dan krijg je geen results meer.

Ik blijf er iig vrij nuchter onder....


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

drm

f0pc0dert

Nee, dat moet gewoon met een left of een right-join (outer dus). Kijk maar 's in de FAQ, staat 't keurig uitgelegd.

hier dus

[ Voor 32% gewijzigd door drm op 15-09-2003 09:56 ]

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


  • Eelke Spaak
  • Registratie: Juni 2001
  • Laatst online: 16-08 19:14

Eelke Spaak

- Vlad -

Persoonlijk gebruik ik het liefst een equi join (met = dus), dan gaat het ongeveer zo:

code:
1
2
3
4
SELECT velden
FROM tabelA, tabelB
WHERE tabelA.id = tabelB.id
AND tabelA.eigenschap = "blauw";


Dit zou volgens mij moeten werken, maar het kan ook zijn dat ik je probleem veel te simpel inschat... :)

TheStreme - Share anything with anyone


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

dusty

Celebrate Life!

Vladimir G. schreef op 15 September 2003 @ 11:32:
Dit zou volgens mij moeten werken, maar het kan ook zijn dat ik je probleem veel te simpel inschat... :)
En als iets niet bestaat in tabelB en wel in tabelA krijg jij die niet terug in je query.

[ Voor 26% gewijzigd door dusty op 15-09-2003 11:37 ]

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


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

drm

f0pc0dert

equi join is namelijk equivalent aan een inner join, en dat wil je dus niet.

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


  • maartenvdv737
  • Registratie: Augustus 2000
  • Laatst online: 17-08 15:34
Het is opgelost.

code:
1
2
3
SELECT t1.id, IF ( t1.id = t2.id,  'selected',  '' ) AS selected
FROM t1
LEFT  JOIN t2 ON ((t2.id= t1.id) AND t1.groepID = $id)


Met dank aan drm.

Ik blijf er iig vrij nuchter onder....

Pagina: 1