[MySQL] Kleine maar lastige query

Pagina: 1
Acties:

  • pierre-oord
  • Registratie: April 2002
  • Laatst online: 12-04 14:05
Ik wil een query in MySQL, maar dat wil niet helemaal lukken. Ik beschrijf eerst even de layout van m'n tabel:


Tabel bouncer_channels
usernamechannel
user1channela
user1channelb
user1channelc
user2channela
user2channelb
user3channela
user3channelb
user3channelc


Ik wil nu een query uitvoeren die kijkt of alle gebruikers in channelc zitten. Als resultaat moet daar dan uitkomen "user2" zit niet in channelc.

Ik heb de volgende simpele query gemaakt:
code:
1
2
3
4
5
6
SELECT
    `bouncer_channels`.`username`
FROM
    `bouncer_channels`
WHERE
    `bouncer_channels`.`channel`='#channelc'


Dit geeft alleen natuurlijk foutieve output, namelijk alle usernames in channelc in plaats van alle usernames die er juist niet in zitten. Hoe draai ik dit om? Met !='channelc' krijg ik natuurlijk alle andere channels te zien, daar gaat het mij niet om.

Kan iemand mij hiermee helpen?

Ondernemer in tech (oud LOQED.com, nu UpToMore.com)


  • pistole
  • Registratie: Juli 2000
  • Laatst online: 21:21

pistole

Frutter

ik denk dat als je je datamodel beter maakt dat het eenvoudiger kan.

Nu moet je eerst een "select distinct user"-achtige query doen, en vervolgens nog een query om alle users die lid zijn van een channel, en de resultaten vergelijken.

edit
...hoewel dit zou moeten kunnen:

SQL:
1
2
3
4
5
6
SELECT DISTINCT
  username 
FROM 
  bouncer_channels
WHERE 
  username NOT IN (select username from bouncer_channels where channel='channelc')


Ik ben echter geen MySQL'er dus ik weet niet of het syntactisch epibreert.

[ Voor 46% gewijzigd door pistole op 02-01-2006 17:04 ]

Ik frut, dus ik epibreer


  • pierre-oord
  • Registratie: April 2002
  • Laatst online: 12-04 14:05
pistole schreef op maandag 02 januari 2006 @ 17:00:
ik denk dat als je je datamodel beter maakt dat het eenvoudiger kan.

Nu moet je eerst een "select distinct user"-achtige query doen, en vervolgens nog een query om alle users die lid zijn van een channel, en de resultaten vergelijken.

edit
...hoewel dit zou moeten kunnen:

SQL:
1
2
3
4
5
6
SELECT DISTINCT
  username 
FROM 
  bouncer_channels
WHERE 
  username NOT IN (select username from bouncer_channels where channel='channelc')


Ik ben echter geen MySQL'er dus ik weet niet of het syntactisch epibreert.
Ja dat ziet er goed uit! Ik zat ook nog te denken aan iets met count ik ga dat even in de manual bekijken zo. Ik dacht, als ik nou van een user "count" doe voor channelc en als dat 0 is, dan selecteren?

edit: Werkt prima trouwens je query op m'n mysql 4.1 :)

[ Voor 7% gewijzigd door pierre-oord op 02-01-2006 17:10 ]

Ondernemer in tech (oud LOQED.com, nu UpToMore.com)


  • pistole
  • Registratie: Juli 2000
  • Laatst online: 21:21

pistole

Frutter

ja kan je ook doen, maar je zult dan moeten joinen omdat je anders met een where de user er weer uit filtert:

SQL:
1
2
3
select distinct b1.bla1, b2.bla2
from bla b1 left outer join bla b2 on b1.bla1=b2.bla1 and b2.bla2='channelc'
where b2.bla2 is null


edit:

substitueer:
bla=bouncer_channels
bla1=username
bla2=channel

Ik frut, dus ik epibreer


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

GX

Nee.

select * from bla where username not in (select username from bla where channel='channelc')

Beetje omslachtig, maar werken zal het

edit:

Wat een vreselijke dubbelpost :/

[ Voor 19% gewijzigd door GX op 02-01-2006 21:19 ]


  • frickY
  • Registratie: Juli 2001
  • Laatst online: 20-04 14:38
Mysql <v5 kent geen subquery's. Welke versie draai je?

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

GX

Nee.

frickY schreef op maandag 02 januari 2006 @ 21:27:
Mysql <v5 kent geen subquery's. Welke versie draai je?
MySQL ondersteunt subqueries vanaf versie 4.1.

[ Voor 4% gewijzigd door GX op 02-01-2006 21:32 ]


  • aex351
  • Registratie: Juni 2005
  • Laatst online: 22:24

aex351

I am the one

Probeer het onderstaande eens. Het gene boven de streep zou moeten werken.

SQL:
1
2
3
4
5
6
    SELECT      bouncer_channels.username, bouncer_channels.channel 
    FROM        bouncer_channels  
    WHERE       bouncer_channels.channel != 'channelc' 
    GROUP BY    bouncer_channels.username 
    -----------------------------------------------------------------------     
        HAVING  bouncer_channel.username != bouncer_channel.channelc

[ Voor 52% gewijzigd door aex351 op 03-01-2006 01:06 ]

< dit stukje webruimte is te huur >

Pagina: 1