Как мне выполнить этот запрос MySQL JOIN? - PullRequest
1 голос
/ 30 ноября 2011

Допустим, у меня есть 2 таблицы.

Первая таблица - это список персон.У пользователя может быть много персон.

mysql> select id, user_id, name from personas_personas;
+----+---------+--------------+
| id | user_id | name         |
+----+---------+--------------+
|  8 |       1 | startup      |
|  9 |       1 | nerd         |
| 10 |       1 | close        |
| 12 |       2 | Nerd         |
| 13 |       2 | Startup      |
| 14 |       2 | Photographer |
+----+---------+--------------+
6 rows in set (0.00 sec)

Теперь у меня есть еще одна таблица, называемая "утверждениями".

mysql> select id, from_user_id, to_user_id, persona_id  from friends_approvals;
+----+--------------+------------+------------+
| id | from_user_id | to_user_id | persona_id |
+----+--------------+------------+------------+
|  2 |            1 |          2 |          8 |
|  3 |            1 |          2 |          9 |
+----+--------------+------------+------------+
2 rows in set (0.00 sec)

Если from_user хочет утвердить to_user для персоны, то вставляется запись.

Я пытаюсь выполнить этот запрос ...

Учитывая пользователя, найти все его персонажи.Затем для каждой персоны определите, одобрено ли оно для определенного to_user.Если это так, верните is_approved = 1 в наборе результатов.В противном случае верните is_approved = 0 в наборе результатов.

Итак, вот с чего я начну:

SELECT *
FROM personas_personas
WHERE user_id = 1
LEFT JOIN friends_approvals ON
...but i don't know where to go from here.

Итак, в конечном наборе результатов должны быть все столбцы в personas_personas таблица, а затем также is_approved для каждого из результатов.

Ответы [ 2 ]

2 голосов
/ 30 ноября 2011

Если я правильно понимаю ваши потребности, вы можете сделать это:

SELECT personas_personas.*,
       CASE WHEN friends_approvals IS NULL THEN 0 ELSE 1 END AS is_approved
  FROM personas_personas
  LEFT
 OUTER
  JOIN friends_approvals
    ON friends_approvals.from_user_id = ...
   AND friends_approvals.to_user_id = personas_personas.user_id
   AND friends_approvals.persona_id = personas_personas.id
 WHERE personas_personas.user_id = ...
;

Это найдет каждую personas_personas запись с указанным user_id вместе с индикатором того, является ли этот пользователь,в этой персоне был «одобрен» указанным from_user_id.

(Если это не , что вы хотите, то уточните!)

2 голосов
/ 30 ноября 2011
 SELECT 
   pp.*,
   CASE
     WHEN exists (
         SELECT 
          * 
         FROM 
          friends_approvals fa  
         WHERE 
          fa.from_user_id = pp.user_id AND
          fa.persona_id = pp.id AND
          fa.to_user_id = 2
          )
      THEN 1
      ELSE 0
   END as is_approved

 FROM 
   personas_personas pp 
 WHERE 
   pp.user_id=1

Или, в зависимости от вашего вкуса:

 SELECT 
   pp.*,
   CASE
     WHEN fa.from_user_id IS NOT NULL
      THEN 1
      ELSE 0
   END as is_approved

 FROM 
   personas_personas pp 
     LEFT OUTER JOIN friends_approvals fa ON
       pp.user_id = fa.from_user_id AND
       pp.id = fa.persona_id AND
       fa.to_user_id = 2
 WHERE 
   pp.user_id=1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...