2013-03-30 3 views
1

Я пытаюсь запустить к югу выберите с объединением, но у меня есть проблема о возвращенииSub-запрос и присоединиться к

SELECT * FROM user, follow 
WHERE user.id IN (SELECT follow FROM referent_follow WHERE referent=3) 

В приведенном выше случае, возвращение хорошо, но у меня есть помимо всех моих стол следует, что я не хотел

SELECT * FROM user, follow 
WHERE follow.user_id IN (SELECT follow FROM referent_follow WHERE referent=3) 

в приведенном выше случае, возвращение хорошо, но у меня есть в дополнение все мои таблицы пользователя, что я не хотел

запрос, который работает не так плохо, является первым один, но у меня есть содержание в моем результате тоже.

+0

Можете ли вы предоставить образец вывода? –

ответ

1

Ваш текущий запрос приводит к декартовому продукту из обеих таблиц: user и follow. Вам необходимо предоставить условие, которое будет объединяться и фильтровать связанные записи.

SELECT DISTINCT a.*, b.* 
FROM user a 
     INNER JOIN follow b 
      ON a.ID = b.user_id 
     INNER JOIN referent_follow c 
      ON a.ID = c.follow 
WHERE c.referent = 3 
+0

Спасибо за ваш ответ. Я рад лучше – Ajouve

+0

Добро пожаловать. Рад, что это помогло! –

1

FROM A,B означает перекрестное соединение А и В. Таким образом, каждая строка в А согласована с каждой строки B
(так totalRows = rowCount(A)*rowCount(B)).

Использование (INNER) JOIN должно работать:

SELECT * 
FROM user 
JOIN follow ON user.id = follow.user_id 
    AND user.id IN (SELECT follow FROM referent_follow WHERE referent=3) 

Использование JOIN, а не IN бы советовал, так как он обычно приводит к более высокой производительности:

SELECT user.*, follow.* 
FROM user 
JOIN follow ON user.id = follow.user_id 
JOIN referent_follow ON user.id = referent_follow.follow 
WHERE referent=3 

Вы можете также нуждаться в DISTINCT, как JW предложил ,

+0

Спасибо за ваш ответ – Ajouve

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