2016-02-08 3 views
3

Я знаю, что вопрос не будет иметь никакого смысла в отношении того, что я прошу, но я имею в виду, что ..... Чтобы сделать его более понятным, я проиллюстрирую свою проблему в примерах:Проверка определенной строки из таблицы, на которую ссылается другая таблица?

I есть таблица userpost, которая содержит сообщения от разных пользователей.

userpost стол:

+---------+--------+--------------+ 
| postId | userId | postMessage | 
+---------+--------+--------------+ 
|  1 |  3 | someText  | 
|  2 |  5 | someText  | 
|  3 |  2 | sometext  | 
|  5 |  6 | someText  | 
+---------+--------+--------------+ 

(! ПОМНИТЕ, чтоuserIdкоторую ссылается наusers таблицу)

У меня есть еще одна таблица называется favorites где postId находится на которую ссылается из userpost таблицы :

избранного стола:

+---------+--------+ 
| postId | userId | 
+---------+--------+ 
|  1 |  5 | 
|  3 |  2 | 
+---------+--------+ 

То, что я хочу, чтобы захватить все данные из userpost и проверить, если определенная userpost была в избранном пользователе (WHERE userId = 5) скажем

Я попытался с помощью этого запроса, но это не то, что я хочу!

SELECT *, 
    (SELECT EXISTS(SELECT * FROM `favorites` INNER JOIN `userpost` on 
    favourites.postId = userpost.postId WHERE favorites.postId = 1 
    AND favorites.userId = 5)) AS isFavourited FROM userpost; 

Это результат следующего запроса:

+---------+--------+-------------+--------------+ 
| postId | userId | postMessage | isFavourited | 
+---------+--------+-------------+--------------+ 
|  1 |  3 | someText |   1 | 
|  2 |  5 | someText |   1 | 
|  3 |  2 | someText |   1 | 
|  5 |  3 | someText |   1 | 
+---------+--------+-------------+--------------+ 

Я знаю, что я делаю ошибку внутри запроса с помощью:

(WHERE favorites.postId = 1 AND favorites.userId = 5)

, которая делает возвращает истину ,

Я дам вам пример , что я хочу:

Допустим, (userId = 5) хочет захватить все userpost и мы должны получить результат ниже:

+---------+--------+-------------+--------------+ 
| postId | userId | postMessage | isFavourited | 
+---------+--------+-------------+--------------+ 
|  1 |  3 | someText |   1 | 
|  2 |  5 | someText |   0 | 
|  3 |  2 | someText |   0 | 
|  5 |  3 | someText |   0 | 
+---------+--------+-------------+--------------+ 

+0

@JayBlanchard Я уже дал то, что пытался. Внимательно прочитайте вопрос. – mikaeel

+0

Ах, он потерялся в массе. –

+0

Если мы говорим о userId = 3, то я бы ожидал, что userId = 3 появится где-нибудь в запросе. Вы бредники? – Strawberry

ответ

2

Try:

SELECT *, 
    postId IN 
     (SELECT postId FROM favourites WHERE userId = 5) 
    AS isFavourited 
FROM userPost 

Ваш запрос проверяет, что строка существует, если пользователь 5 избранных сообщению 1; а не там, где пользовательские избранные 5 выбираются в этой строке возврата.

+0

Вау! Работает отлично! Но можете ли вы объяснить, как работает ваш запрос @amanning – mikaeel

+1

Это, вероятно, будет ужасно медленным в больших наборах данных. – Strawberry

+0

@Strawberry Действительно! Я точно использую большие наборы данных для своей социальной сети. Любое предложение?? – mikaeel

2

Я думаю, вы можете сделать что-то подобное, если я пойму, что вы спрашиваете:

select up.*, case when f.postId is null then "0" else "1" end as isFavourited 
from userpost up 
left join favourites f on f.postId = up.postId and f.userId = up.userId 
+0

Работает отлично!Не могу выбрать между правильными ответами – mikaeel

+0

@mikaeel FWIW, это тот, который я бы выбрал. Я предполагаю, что, соответственно проиндексированный, он будет масштабироваться лучше. – Strawberry

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