[MySQL] Missende links in relationele database zoeken.

Pagina: 1
Acties:

  • cyberstalker
  • Registratie: September 2005
  • Niet online

cyberstalker

Eersteklas beunhaas

Topicstarter
Ik heb een database waarin een aantal entries mist, waarnaar wordt verwezen vanuit een andere tabel.

Het gaat om de tabellen topics en users. In de users tabel missen een aantal entries. De layout is als volgt:

users:
SQL:
1
2
3
4
5
6
+----------+-----------------+------+-----+---------+-------+
| Field    | Type            | Null | Key | Default | Extra |
+----------+-----------------+------+-----+---------+-------+
| id       | int(4) unsigned |      | PRI | 0       |       |
| username | varchar(30)     | YES  | MUL | NULL    |       |
+----------+-----------------+------+-----+---------+-------+


topics:
SQL:
1
2
3
4
5
6
7
8
9
10
11
12
+----------+------------------+------+-----+---------+-------+
| Field    | Type             | Null | Key | Default | Extra |
+----------+------------------+------+-----+---------+-------+
| id       | int(3) unsigned  |      | PRI | 0       |       |
| forum    | int(1) unsigned  |      |     | 0       |       |
| title    | varchar(60)      | YES  | MUL | NULL    |       |
| postIcon | int(1) unsigned  |      |     | 0       |       |
| userId   | int(3) unsigned  |      | MUL | 0       |       |
| postTime | int(4) unsigned  |      |     | 0       |       |
| clicks   | int(10) unsigned |      | MUL | 0       |       |
| last_ip  | int(4) unsigned  |      |     | 0       |       |
+----------+------------------+------+-----+---------+-------+


userId in de tabel topics verwijst naar een id in users. In users mis ik echter zo'n tienduizend entries. Ik probeer daar een lijst van te krijgen, zodat ik deze kan aanvullen.

Iets zegt mij dat ik daar een subquery voor nodig heb, en dat heb ik dan ook geprobeerd, maar ik begrijp het niet, en ik doe iets verkeerd.

SQL:
1
SELECT DISTINCT userId FROM topics WHERE (SELECT COUNT(id) FROM users WHERE users.id=topics.userId)=0;


Ik krijg hier dus een foutmelding van MySQL. Is er iemand die mij kan uitleggen wat ik fout doe?

Ik ontken het bestaan van IE.


  • whoami
  • Registratie: December 2000
  • Laatst online: 16:05
Nee, want je zegt niet welke foutmelding je krijgt.

Verder klopt je SQL query zowiezo niet.
Als je de users wil hebben die zich in de topics tabel bevinden, maar niet in de users tabel, dan heb je idd een subquery nodig (ondersteunt jouw versie van mysql dat al ? Zoniet kan je mbhv een outer join hetzelfde resultaat krijgen).
code:
1
2
select userid from topcis
where userid not in ( select id from users )


Kent de versie van MySQL waar je mee werkt dan geen foreign key constraints ?

https://fgheysels.github.io/


  • cyberstalker
  • Registratie: September 2005
  • Niet online

cyberstalker

Eersteklas beunhaas

Topicstarter
OK, hier dan de foutmelding:

SQL:
1
2
select distinct userId from topics where (select count(id) from users where users.id=topics.userId)=0;
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 count(id) from users where users.id=topics.userId)=0' at


De serverversie is overigens '4.0.23_Debian-3ubuntu2.1-log'. Ik heb ook jouw suggestie geprobeerd (zonder de spelfouten :P ), maar die geeft mij ook een error:

SQL:
1
2
select userId from topics where userId not in (select id from users);
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 id from users)' at line 1

Ik ontken het bestaan van IE.


  • NMe
  • Registratie: Februari 2004
  • Laatst online: 11-04 17:49

NMe

Quia Ego Sic Dico.

MySQL ondersteunt pas vanaf versie 4.1 subqueries.

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


  • whoami
  • Registratie: December 2000
  • Laatst online: 16:05
Tja, dan zal je het dus op een andere manier moeten oplossen.
Met een outer join.
Ik geloof dat er in de mysql manual wel uitgelegd staat hoe je dat kunt gebruiken ipv subqueries.

https://fgheysels.github.io/


  • GX
  • Registratie: Augustus 2000
  • Laatst online: 14-05-2025

GX

Nee.

Zou
SQL:
1
2
3
4
5
SELECT    a.userId
FROM      topics a
LEFT JOIN users b
  ON     (a.userId = b.id)
WHERE     b.id = NULL
niet werken? Het is dan wel psuedo want ik heb even de mogelijkheid niet om te testen.

[ Voor 4% gewijzigd door GX op 31-10-2005 09:47 ]


  • Grijze Vos
  • Registratie: December 2002
  • Laatst online: 21-02 23:50
GX schreef op maandag 31 oktober 2005 @ 09:46:
Zou
SQL:
1
2
3
4
5
SELECT    a.userId
FROM      topics a
LEFT JOIN users b
  ON     (a.userId = b.id)
WHERE     b.id = NULL
niet werken? Het is dan wel psuedo want ik heb even de mogelijkheid niet om te testen.
Als b.id = NULL, dan is ook a.userID = NULL, en dan krijg je een ontzettend groot cartesisch product denk ik zo.

---------
Als ik het goed begrijp heeft de TS een tabel1 met verwijzingen naar tabel2, waarbij de elementen uit tabel2 er niet meer zijn. Wat ik zou doen, is even het maximum ID queryen van de FK van tabel1 en de PK van tabel2. Dan maak je een composite (is dat het juiste woord?) tabel van alle ID's tot en met het maximum van tabel2, en kun je daarmee joinen.

Je zou dat in 1 query kunnen doen, maar ik zou het simpel houden en gewoon ff een temp tabelletje aanleggen..

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


  • GX
  • Registratie: Augustus 2000
  • Laatst online: 14-05-2025

GX

Nee.

Grijze Vos schreef op maandag 31 oktober 2005 @ 14:54:
[...]


Als b.id = NULL, dan is ook a.userID = NULL, en dan krijg je een ontzettend groot cartesisch product denk ik zo.
Volgens mij niet; het is namelijk een left join, dus alleen de items uit tabel b die NULL zijn hebben een NULL value, de linker kant heeft dan een kloppende ID welke dus rechts mist.

  • Grijze Vos
  • Registratie: December 2002
  • Laatst online: 21-02 23:50
GX schreef op maandag 31 oktober 2005 @ 14:56:
[...]

Volgens mij niet; het is namelijk een left join, dus alleen de items uit tabel b die NULL zijn hebben een NULL value, de linker kant heeft dan een kloppende ID welke dus rechts mist.
Je join-conditie vraagt toch om gelijkheid?

--------------
Dit is volgens mij wat TS bedoelt:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
tabel1
id | FK
1  | 1
2  | 2
3  | 3
4  | 4
5  | 5

tabel2
PK
1
3
5

De bedoeling is dus om nu de id's 2 en 4 terug te krijgen, de missende PKs uit tabel2, die vanuit tabel1 gevraagd worden.

[ Voor 29% gewijzigd door Grijze Vos op 31-10-2005 15:00 ]

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


  • cyberstalker
  • Registratie: September 2005
  • Niet online

cyberstalker

Eersteklas beunhaas

Topicstarter
Grijze Vos schreef op maandag 31 oktober 2005 @ 14:57:
[...]

Je join-conditie vraagt toch om gelijkheid?

--------------
Dit is volgens mij wat TS bedoelt:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
tabel1
id | FK
1  | 1
2  | 2
3  | 3
4  | 4
5  | 5

tabel2
PK
1
3
5

De bedoeling is dus om nu de id's 2 en 4 terug te krijgen, de missende PKs uit tabel2, die vanuit tabel1 gevraagd worden.
Dat is precies wat ik bedoel. De suggestie van GX werkt overigens niet, ik krijg dan een 'Empty set' terug.

Het is ook niet zo dat de gegevens na een bepaald punt missen, er zitten dus zeg maar 'gaten' in de tabel users.

Ik heb net een tutorial over left join's gelezen, en voor zover ik begrijp is de query van GX inderdaad correct, maar toch krijg ik niet de resultaten die ik wil, ik probeerde het volgende:

SQL:
1
2
3
4
5
6
7
8
9
10
SELECT
    a.userId
FROM
    topics  AS  a
LEFT JOIN
    users   AS  b
ON
    (a.userId = b.id)
WHERE
    b.id=NULL;

[ Voor 6% gewijzigd door cyberstalker op 31-10-2005 15:43 . Reden: spelvautjes ]

Ik ontken het bestaan van IE.


  • TheRookie
  • Registratie: December 2001
  • Niet online

TheRookie

Nu met R1200RT

cyberstalker schreef op maandag 31 oktober 2005 @ 15:42:
maar toch krijg ik niet de resultaten die ik wil
Wat krijg je dan wel/niet terwijl je het wel/niet verwacht ?

  • cyberstalker
  • Registratie: September 2005
  • Niet online

cyberstalker

Eersteklas beunhaas

Topicstarter
TheRookie schreef op maandag 31 oktober 2005 @ 16:06:
[...]

Wat krijg je dan wel/niet terwijl je het wel/niet verwacht ?
Ik krijg dus een empty set, zoals ik al zei in mijn vorige bericht. En dat klopt niet, omdat er meer dan negenduizend entries missen in de users tabel.

Ik ontken het bestaan van IE.


  • GX
  • Registratie: Augustus 2000
  • Laatst online: 14-05-2025

GX

Nee.

Grijze Vos schreef op maandag 31 oktober 2005 @ 14:57:
[...]

Je join-conditie vraagt toch om gelijkheid?
Nee, mijn join-conditie vraagt om gelijkheid-of-geen-record

  • Olaf van der Spek
  • Registratie: September 2000
  • Niet online
Is dat niet per definitie false? 'is null' werkt beter gok ik.

  • cyberstalker
  • Registratie: September 2005
  • Niet online

cyberstalker

Eersteklas beunhaas

Topicstarter
OlafvdSpek schreef op maandag 31 oktober 2005 @ 17:00:
[...]

Is dat niet per definitie false? 'is null' werkt beter gok ik.
Dat ik daar zomaar overheen kijk 8)7 .

Ik ontken het bestaan van IE.

Pagina: 1