2014-11-18 1 views
2

Привет У меня есть 3 таблицы:SQL запрос с использованием, где в поле в другой таблице

(Это пример пользователей системы & сообщений)

пользователей: идентификатор, имя пользователя, пароль

Сообщений: идентификатор , user_id, содержание

post_likes: идентификатор, user_id, post_id, дата

Я хочу получать всю почту нравится, что пользователь сделал на другие функции и только. Пользователю могут нравиться все сообщения (его собственное сообщение и сообщение другого пользователя).

Другими словами: Я не хочу, чтобы его любил сообщения, которые он сам опубликовал.

Нечто подобное (это не синтаксис, просто пример, чтобы выразить себя лучше!):

SELECT * FROM post_likes WHERE user_id = 3 И posts.user_id = 3

ответ

4

Попробуйте один

SELECT * FROM post_likes pl 
LEFT JOIN posts p ON pl.post_id=p.id 
WHERE pl.user_id = 3 AND p.user_id != 3 
+3

Это должно быть внутреннее соединение. Левое соединение здесь не имеет смысла. Более того, когда вы превращаете его во внутреннее соединение, сравнивая 'p.user_id! = 3'. –

0

Попробуйте что-нибудь вроде этого:

SELECT * 
FROM users u 
INNER JOIN post_likes pl ON (u.user_id = pl.user_id) 
INNER JOIN posts p ON (p.id = pl.post_id AND p.user_id <> u.id) 
WHERE u.id = ... 
0

Вы ищете post_likes пользователя 3, где post_id не представляет собой своего поста (т. где post_id не входит в набор своих собственных post_ids):

select * 
from post_likes 
where user_id = 3 
and post_id not in (select id from posts where user_id = 3); 
1

Вы можете попробовать с этим

SELECT * FROM post_likes pls 
INNER JOIN posts p ON pls.post_id=p.id 
WHERE pls.user_id = 3 AND p.user_id != 3