2010-01-22 2 views
0

Я создаю таблицу, которая показывает всех зарегистрированных пользователей, к которым еще не подписал текущий пользователь. Но как только он подписался на кого-то, мне нужно отфильтровать этот список, чтобы исключить их.Запрос пользователя/подписчика sql

Предположим, что theres стол под названием подписан, в котором перечислены Пользователь и к которому он подписан.

|UserId||SubscriberID| 

Его легко сделать это в несколько запросов, но я безуспешно пытался сделать это в один запрос, чтобы сохранить дополнительный цикл MySQL вызовов.

Вот что я до сих пор:

SELECT u.UserID, FullName, UserName from users u 
    LEFT JOIN subscribed t ON 
    ((u.UserName LIKE '%$search%' OR 
     u.Email LIKE '%$search%') AND 
     ({$_SESSION['ID']} = t.UserID 
     AND t.FollowerID != u.UserID) 
    ) 

Я знаю, что последняя часть запроса является неправильной, так как я только сравнить, если Идентификатор_пользователь и FollowerID не совпадают для одной конкретной строки, а не весь стол.

+0

Последняя часть должна быть в ИНЕКЕ запроса, так что он будет работать в пределах каждой строки, а чем присоединение ко всей таблице ... –

+0

Кажется, ничего не меняет. Можете ли вы уточнить? –

ответ

0

Чтобы найти список результатов в таблице A, которые не указаны в таблице B, у вас есть два варианта. Используйте либо синтаксис NOT IN, либо LEFT JOIN и посмотрите, где находится поле PK в таблице B NULL.

NOT IN пример:

SELECT a.id FROM a WHERE a.id NOT IN (SELECT b.id FROM b)

LEFT JOIN пример:

SELECT a.id FROM a LEFT JOIN b ON (a.id = b.id) WHERE (b.id IS NULL)

+1

Я должен упомянуть, что использование 'NOT IN' с подзапросом потребует MySQL 5.0 или выше и будет медленнее, чем идея' LEFT JOIN'. Я лично предпочитаю семантику синтаксиса «NOT IN», несмотря на отсутствие производительности, если это не оказывает существенного влияния на время ответа вашего приложения. –

+1

MySQL 4.1 поддерживает подзапросы. –

+0

О, спасибо, Билл, это звучит знакомо сейчас, когда ты упоминаешь об этом. –