[mysql] Probleem bij opstellen query

Pagina: 1
Acties:

  • mahi
  • Registratie: Juni 2001
  • Laatst online: 03-10-2025

mahi

God bless GoT

Topicstarter
En nog maar eens een probleempje... :)

Ik heb 2 tabellen in MySQL. Hieruit wil ik 1 kolom halen aan de hand van gegevens uit beide tabellen. Omdat een simpel voorbeeldje meer zegt dan woorden:

table: cat
code:
1
2
3
4
5
6
7
+----------+----------+
|  cat_id  | cat_name |
+----------+----------+
|        1 | Nieuws   |
|        2 | Artikels |
|        3 | Polls    |
+----------+----------+
Er zitten nog heel wat andere kolommen in deze tabel, maar die doen niet terzake.

table: priv
code:
1
2
3
4
5
6
7
+----------+----------+----------+
| priv_id  |  cat_id  | user_id  |
+----------+----------+----------+
|        1 |        1 |        4 |
|        2 |        2 |        3 |
|        3 |        2 |        4 |
+----------+----------+----------+
De bedoeling? Zoals je ziet hebben beide tabellen een 'cat_id' veld. Dit is dan ook het verband tussen de 2 tabellen. Het idee is nu een lijst te maken van alle categorienamen ('cat_name') uit tabel 'cat' die niet voorkomen in tabel 'priv' voor een bepaalde gebruiker ('user_id').

Een lijst van alle categorienamen maken is makkelijk...
code:
1
SELECT cat.cat_name FROM cat;
Een lijst van alle categorienamen die niet voorkomen in tabel 'priv':

code:
1
2
3
4
5
SELECT cat.cat_name
FROM cat
LEFT JOIN priv
ON cat.cat_id = priv.cat_id
WHERE priv.cat_id IS NULL;
Maar nu moet er ook nog gekeken worden naar het 'user_id' veld. Bovenstaande query geeft steeds maar 1 resultaat terug ('Polls') omdat cat_id = 3 niet voorkomt in 'priv'. Maar voor user_id = 3 komt 'Nieuws' eveneens niet voor. En voor user_id's anders dan 3 en 4 komt er niets voor in tabel 'priv' en zouden dus alledrie de categorieën uit 'cat' weergegeven moeten worden.

Ik heb al de gekste queries geprobeerd, maar ze geven of foutmeldingen of doen niet wat ik denk dat ze moeten doen. Je zou denken dat je bij de LEFT JOIN priv nog een extra WHERE zou moeten opgeven waarmee naar het user_id gekeken wordt, maar dat geeft een foutieve syntax.

De oplossing is vast eenvoudig, maar ik kom er niet uit :(

A bus station is where a bus stops. A train station is where a train stops... On my desk I have a workstation.


  • faabman
  • Registratie: Januari 2001
  • Laatst online: 08-08-2024
snap je vraag niet helemaal, en de query zal ook wel niet de meest efficiente zijn

ASP:
1
2
3
SELECT cat.*
  FROM cat
  WHERE cat.cat_id NOT IN (SELECT cat_id FROM priv WHERE user_id = x)

Op zoek naar een baan als Coldfusion webdeveloper? Mail me!


  • mahi
  • Registratie: Juni 2001
  • Laatst online: 03-10-2025

mahi

God bless GoT

Topicstarter
Aan je query te zien heb je de vraag goed begrepen. Ik had zelf al geëxperimenteerd met subselects, maar dat wil maar niet werken. Ook uw voorbeeldje geeft gewoon een 1064 Syntax Error. Ik miszie er nochtans niets aan. MySQL zegt exact:

ERROR 1064: You have an error in your SQL syntax. Check the manual that corresponds to your MySQL server version for the right syntax to use near 'SELECT cat_id FROM priv WHERE...

Wanneer ik de subselect ontleed en apart test werkt het wel... Het lijkt wel alsof de MySQL versie geen subselects ondersteunt (versie 4.0.16). Daarmee dat ik naar LEFT JOIN's ben gaan kijken. Die werken wel, maar ik kan er blijkbaar niet het beoogde resultaat mee behalen.

A bus station is where a bus stops. A train station is where a train stops... On my desk I have a workstation.


  • Ariejan
  • Registratie: Februari 2001
  • Laatst online: 20-05 10:04
MySQL ondersteund voor zo ver ik weet geen subqueries.

Computeraar - Part-time Maker van Geluiden - https://neuroslasher.bandcamp.com


  • creative8500
  • Registratie: September 2001
  • Laatst online: 03-01 16:54

creative8500

freedom.

Ariejan schreef op 14 januari 2004 @ 14:25:
MySQL ondersteund voor zo ver ik weet geen subqueries.
http://www.mysql.com/doc/en/Subqueries.html

[ Voor 4% gewijzigd door creative8500 op 14-01-2004 14:28 ]


  • mahi
  • Registratie: Juni 2001
  • Laatst online: 03-10-2025

mahi

God bless GoT

Topicstarter
Dat zou natuurlijk veel verklaren, maar ik was in de veronderstelling dat ondersteuning voor subselects toegevoegd werd aan MySQL ergens in de late 3.xx versies?

Volgens de link van "creative8500" is de ondersteuning voor subselects pas volledig toegevoegd vanaf 4.1. Ik heb nog 4.0.16 en aangezien de server niet van mij is heb ik weinig mogelijkheden om die MySQL te upgraden naar een recentere versie.

Anyway, iemand een idee hoe ik dit dan kan oplossen zonder subselects?

Alvast bedankt iedereen voor jullie input!

[ Voor 30% gewijzigd door mahi op 14-01-2004 14:36 ]

A bus station is where a bus stops. A train station is where a train stops... On my desk I have a workstation.

Pagina: 1