Angelo Zanetti <[EMAIL PROTECTED]> wrote on 06/08/2005 01:38:42 PM:
> Let me rewrite what it's meant to do as i mgiht not have been clear.
> ok for a single user I want to get all the users (from the user table)
> that aren't a buddy for that user.
> users
> 1 bob
> 2 tom
> 3 mike
> buddylist
> 1 2
> 1 3
> 2 1
> 2 3
> 3 1
>
> //therefore if i searched for mike it would return tom as he is not
> listed as a buddy for mike but bob is.
> The query is half working but doesnt seem to be working for an
> individual user.
> thanks to those who have helped so far...
> Michael Stassen wrote:
> > Angelo Zanetti wrote:
> >
> >> thanks shawn it seems to be working but i forgot to add that i need
it
> >> for a single user ID, in other words it must bring back all user ids
in
> >> the user table if they do not exist for that user in the buddylist.
> >>
> >> so what i've tried is this:
> >>
> >> SELECT u.* FROM users u LEFT JOIN buddylist bl ON u.userID =
bl.userID
> >> WHERE u.isactive =1 AND u.userid!='$userid' AND bl.userID is null
> >>
> >> but this still returns some results that exist in the buddyList
table.
> >
> >
> > I'm not sure Shawn's query does what you originally asked. His was
> >
> > SELECT u.UserID
> > FROM Users u
> > LEFT JOIN BuddyList bl
> > ON u.userID = bl.userID
> > WHERE u.isactive =1
> > AND bl.userID is null;
> >
> > which returns active users with no buddies. As I understood it, you
> > wanted active users who aren't on another user's buddy list. I
> > believe that would require joining on buddyId rather than userID, like
> > this:
> >
> > SELECT u.UserID
> > FROM Users u
> > LEFT JOIN BuddyList bl
> > ON u.userID = bl.buddyID
> > WHERE u.isactive =1
> > AND bl.userID is null;
> >
> > Adding your new requirement that we only look at a single user's buddy
> > list should be simple:
> >
> > SELECT u.UserID
> > FROM Users u
> > LEFT JOIN BuddyList bl
> > ON u.userID = bl.buddyID AND bl.userID = '$userid'
> > WHERE u.isactive =1
> > AND bl.userID is null;
> >
> > Does that do what you want?
> >
> > Michael
> >
Michael's last answer:
SELECT u.UserID
FROM Users u
LEFT JOIN BuddyList bl
ON u.userID = bl.buddyID
AND bl.userID = '$userid'
WHERE u.isactive =1
AND bl.userID is null;
Should do all of what you want except exclude the original user (so that
the user cannot become their own buddy). To do that I would change it to
read
SELECT u.UserID
FROM Users u
LEFT JOIN BuddyList bl
ON u.userID = bl.buddyID
AND bl.userID = '$userid'
WHERE u.isactive =1
AND bl.userID is null
and u.UserID != '$userid';
Can you show us some sample data and the result of either of these queries
and explain what's wrong? I agree with Michael that this should work for
what you need.
Shawn Green
Database Administrator
Unimin Corporation - Spruce Pine