[MySQL] Uit 1 tabel 'niet dezelfde' halen.

Pagina: 1
Acties:
  • 115 views sinds 30-01-2008
  • Reageer

  • commeric
  • Registratie: November 2002
  • Laatst online: 14-08-2025
Sorry voor de vreemde topic titel maar ik kon er geen betere opschrijving voor geven.

Het datamodel ansich is veel groter, maar ik weergeef hier even het probleem gereduceerd.

Systeem:
MySql 4.0.20
PHP 4
Apache


Probleem: Er is 1 tabel, daarin bevinden 3 kolomen. #id #uid en #oid. Id is een autoincrement kolom voor de tabel. #uid is het userid en #oid is het objectid.
Nu zijn er verschillende users en verschillende objecten in deze tabel.
Het doel is om de objecten te weergeven die user 1 niet heeft maar user 2 wel.

En omdat een 'plaatje' meer zegt dan duizend woorden:

tbl_link:
IDUIDOID
112
213
314
415
521
622
723
825
926


Overzicht van wie welk object 'heeft'
USER1 USER2
1
2 2
33
4
55
6


UIt de query moet dus als resultaat komen:

code:
1
2
OID: 1
OID: 6

Deze 2 OID's heeft user 2 wel, maar user 1 niet. En dus NIET OID 4, die user 1 WEL heeft maar user 2 niet.


Wat geprobeerd?
Dit soort query's en aanverwanten.
code:
1
2
3
4
5
6
7
8
9
$query = "  SELECT
                lA.oid
            FROM
                tbl_link lA,
                tbl_link lB
            WHERE
                lA.oid != lB.oid
            AND lA.uid = '1'
            ANd lB.uid = '2'

Ook geeft de search geen echte uitkomt omdat ik dit probleem niet kort kan omschrijven.

:)

[ Voor 3% gewijzigd door commeric op 20-10-2004 22:14 ]


  • Glimi
  • Registratie: Augustus 2000
  • Niet online

Glimi

Designer Drugs

(overleden)
MySQL 4 had toch een INTERSECT ?
code:
1
2
3
Select oid From tbl_link WHERE uid = 2
INTERSECT
Select oid From tbl_link WHERE uid = 1

(Waarom quotes om een uid? Is dat geen integer dan?)

[edit] Niet dus :/ Sorry
http://dev.mysql.com/doc/mysql/en/TODO_sometime.html

[ Voor 18% gewijzigd door Glimi op 20-10-2004 22:32 ]


  • commeric
  • Registratie: November 2002
  • Laatst online: 14-08-2025
Je was me net voor ;)
http://dev.mysql.com/doc/...s_between_geometries.html Hier staat INTERSECT beschreven en er staat inderdaad ook dat ie nog niet geimplenteerd is.

En ik zet eigenlijk standaard om alle gegevens ' ', meer een soort gewoonte dus :)

  • Vae Victis
  • Registratie: April 2001
  • Laatst online: 19-05 21:29

Vae Victis

Dark Lord of the Sith

SQL:
1
2
3
4
5
6
7
8
9
SELECT t.oid
FROM tbl_link t
LEFT  JOIN ( 
SELECT  * , COUNT( a.oid )  AS aantal
FROM  `tbl_link` a
LEFT  JOIN tbl_link b ON b.oid = a.oid
WHERE a.uid =2
GROUP  BY a.oid )q ON t.id = q.id
WHERE q.aantal =1

Probeer deze eens.
Heb zelf een hogere versie mysql, dus weet niet of het werkt.
[edit]
tabel naam was anders (test -> tbl_link)

[ Voor 12% gewijzigd door Vae Victis op 20-10-2004 22:50 ]


  • BrZ
  • Registratie: Maart 2000
  • Laatst online: 20-05 16:16

BrZ

Volgens zou het hiermee moeten lukken:

code:
1
2
3
SELECT b.oid
FROM tbl_link a, tbl_link b
WHERE a.id = b.id AND a.uid = 1 AND b.uid = 2 AND a.oid IS NULL

  • mklerx
  • Registratie: April 2000
  • Laatst online: 20-05 15:29
BrZ schreef op 20 oktober 2004 @ 22:48:
Volgens zou het hiermee moeten lukken:

code:
1
2
3
SELECT b.oid
FROM tbl_link a, tbl_link b
WHERE a.id = b.id AND a.uid = 1 AND b.uid = 2 AND a.oid IS NULL
Nee, werkt niet (geen resultaten). Volgens mij klopt hij ook niet, want waarom 'a.id = b. id' daarmee krijg je dus 2x hetzelfde record uit de tabel in één row. Bovendien: een IS NULL zul je nooit krijgen met een gewone JOIN, alleen met een LEFT JOIN of een RIGHT JOIN.

  • Grijze Vos
  • Registratie: December 2002
  • Laatst online: 21-02 23:50
Als je je MySQL naar 4.1+ upgrade kun je subqueries gebruiken. ;)

Die zijn verrekte handig voor dit soort problemen.

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


  • mklerx
  • Registratie: April 2000
  • Laatst online: 20-05 15:29
Na erg veel bloed, zweet en tranen en zonder bijgaande uitleg over hoe het nou exact werkt:

code:
1
2
3
4
5
6
7
8
SELECT DISTINCT(a.oid)
FROM tbl_link a 
LEFT JOIN tbl_link b ON a.uid<>b.uid 
LEFT JOIN tbl_link c ON a.oid=c.oid AND c.uid=1 
WHERE a.oid<>b.oid
AND a.id<>b.id
AND a.uid=2
AND c.id IS NULL

  • BrZ
  • Registratie: Maart 2000
  • Laatst online: 20-05 16:16

BrZ

mklerx schreef op 20 oktober 2004 @ 22:54:
[...]


Nee, werkt niet (geen resultaten). Volgens mij klopt hij ook niet, want waarom 'a.id = b. id' daarmee krijg je dus 2x hetzelfde record uit de tabel in één row. Bovendien: een IS NULL zul je nooit krijgen met een gewone JOIN, alleen met een LEFT JOIN of een RIGHT JOIN.
Hmm, wat ik zei sloeg compleet nergens op :X

Het zou iig heel mooi met een full outer join kunnen, met natuurlijk ondersteunt MySQL dat weer niet ;)

  • Postman
  • Registratie: Februari 2000
  • Laatst online: 01-05 13:23
BrZ schreef op 21 oktober 2004 @ 01:39:
Het zou iig heel mooi met een full outer join kunnen, met natuurlijk ondersteunt MySQL dat weer niet ;)
Klopt, maar ze hebben wel een UNION() sinds MySQL 4 (http://dev.mysql.com/doc/mysql/en/JOIN.html zoek maar eens op FULL OUTER JOIN)

  • commeric
  • Registratie: November 2002
  • Laatst online: 14-08-2025
mklerx schreef op 20 oktober 2004 @ 23:18:
Na erg veel bloed, zweet en tranen en zonder bijgaande uitleg over hoe het nou exact werkt:

code:
1
2
3
4
5
6
7
8
SELECT DISTINCT(a.oid)
FROM tbl_link a 
LEFT JOIN tbl_link b ON a.uid<>b.uid 
LEFT JOIN tbl_link c ON a.oid=c.oid AND c.uid=1 
WHERE a.oid<>b.oid
AND a.id<>b.id
AND a.uid=2
AND c.id IS NULL
_/-\o_ _/-\o_ _/-\o_

Perfect man! Daar had ik dus zelf echt nooit op kunnen komen. Ik ga hem morgen bestuderen en dan zal ik hem proberen uit te leggen :P
Pagina: 1