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

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

  • commeric
  • Registratie: November 2002
  • Laatst online: 01-07 08:51
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: 01-07 08:51
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: 17-08 22:17

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: 30-07 09:36

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: 24-07 10:58
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: 24-07 10:58
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: 30-07 09:36

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: 15-08 20:11
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: 01-07 08:51
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