2013-05-10 2 views
1

У меня есть запрос:Верхняя видимость стол выберите с несколькими подзапросов

SELECT b.user_id, b.active FROM users b 
WHERE b.followers_count != (SELECT COUNT(*) 
    FROM (SELECT u.user_id 
     FROM user_follow uf,users u,user_follow_request ufr 
     WHERE 
     uf.following_id = b.user_id AND 
     uf.following_id = ufr.friend_id AND 
     ufr.status = 'approved' AND 
     ufr.user_id = u.user_id AND u.user_id != b.user_id AND u.active != 0 
     GROUP BY u.user_id) a) 
AND b.active = -1 limit 5; 

Он должен выбрать все user_id «S от users, которые имеют разные followers_count в колонке от одного рассчитывается по SQL.

Но проблема в том, что я получаю сообщение об ошибке

Error Code: 1054. Unknown column 'b.user_id' in 'on clause' 

Что я делаю неправильно? Высоко цените вашу помощь.

+0

Попробуйте использовать оригинальное имя ИЭ, пользователи вместо б.. – Dhinakar

+0

еще не удался. Код ошибки: 1054. Неизвестный столбец 'users.user_id' в 'where clause' – Andrew

+0

Используйте явный синтаксис соединения во всем. Не смешивайте и не сопоставляйте неявный (comma) синтаксис соединения и явный синтаксис JOIN. Порядок, в котором соединяются таблицы, становится (в некотором смысле) непредсказуемым. Тем не менее, ваша проблема сложнее и не может быть легко решена без просмотра фактических таблиц. – Strawberry

ответ

0

Возможно, вы имели в виду uf.user_id = b.user_id вместо uf.following_id = b.user_id? Во всяком случае, для чего стоит таблица user_follow?

Согласитесь на Клубнику, вам лучше использовать явные объединения. Их гораздо легче читать и понимать. Вот то, что вы, возможно, упоминается (обратите внимание, что user_follow таблица вообще не используется):

SELECT u.user_id, u.followers_count, IF(ISNULL(uafc.actual_fc),0,uafc.actual_fc) AS afc 
    FROM users AS u 
    LEFT JOIN (
     SELECT u.user_id AS user_id, COUNT(*) AS actual_fc 
     FROM users AS u 
      JOIN user_follow_request AS ufr 
      ON ufr.friend_id = u.user_id 
      JOIN users AS fu 
      ON fu.user_id = ufr.user_id 
     WHERE ufr.user_id != u.user_id 
      AND ufr.status = 'approved' 
      AND fu.active != 0 
     GROUP BY u.user_id, u.followers_count 
    ) AS uafc 
     ON uafc.user_id = u.user_id 
    WHERE u.followers_count != IF(ISNULL(uafc.actual_fc),0,uafc.actual_fc) 
; 

Там может быть несколько лучше подходит для NULL обходного.

Посмотри на SQLFiddle: http://sqlfiddle.com/#!2/71f6c/3

+0

Этот запрос не работает, не возвращает то, что он должен user_follow, это таблица, используемая для последователей/следующих отношений, мы должны использовать этот запрос, поскольку явные объединения полностью совпадают. – Andrew

+0

Было бы неплохо увидеть структуры таблиц и примеры данных. – Olexa

Смежные вопросы