2015-02-09 2 views
1

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

У меня есть две таблицы

Table_users      Table_followers 
| id | name  |    | follow_id | user_id | 
| 1 | John  |    | 1   | 2  | 
| 2 | Max  |    | 3   | 1  | 
| 3 | Mary  |    | 2   | 1  | 
| 4 | Robert |    | 6   | 1  | 
| 5 | Robin |    | 1   | 5  | 
| 6 | Sarah |    | 1   | 6  | 
  1. Я хотел бы чтобы вернуться в один запрос, пользователи, следующие за Джоном и Джоном, за ними следуют, так что это будет называться MATCH.
  2. Тогда пользователи, которые следуют Джон Последователи
  3. И, наконец, пользователи следуют Джон, НИЖЕ

я использовал следующий запрос, но он возвращает дубликаты, и это далеко от того, что я ищу

SELECT u.id, u.name, f.follower_id, f.user_id 
FROM table_users u 
LEFT JOIN table_followers f ON f.follower_id = u.id OR f.user_id = u.id 
WHERE (f.user_id != 1 OR f.follower_id != 1) AND u.id != 1 
ORDER BY u.id ASC"; 

Желаемый результат был бы как ...

| uid | name  | match | follower | following | 
| 2 | Max  | 1  | null  | null  | 
| 6 | Sarah | 1  | null  | null  | 
| 3 | Mary  | null | 1  | null  | 
| 5 | Robin | null | null  | 1   | 

было бы р ossible вообще с SQL?

ответ

1

Одним из способов решения этой проблемы является присоединением к таблице следящей дважды (один раз для последователей, один раз ниже) и сделать запрос следующим образом:

select 
    u.id, 
    u.name, 
    case when follow_id and user_id then 1 end as `match`, 
    case when follow_id and user_id is null then 1 end as follower, 
    case when user_id and follow_id is null then 1 end as following 
from Table_users u 
left join (select user_id from Table_followers where follow_id = 1) followers 
    on u.id = followers.user_id 
left join (select follow_id from Table_followers where user_id = 1) following 
    on u.id = following.follow_id 
where u.id <> 1 and (follow_id or user_id) 
order by `match` desc, follower desc, following desc, u.id; 

я уверен, что есть более эффективные и экологически чистые способы чтобы сделать это, но уже поздно, и старый мозг работает только на средней скорости;)

Sample SQL Fiddle

с MySQL ВЫБРАТЬ часть может быть снижена до этого:

select 
    u.id, 
    u.name, 
    ifnull((follow_id and user_id),0) as `match`, 
    (follow_id and user_id is null) as follower, 
    (user_id and follow_id is null) as following 
from Table_users u 

Но это дало бы 0 вместо нуля для отсутствующих значений. (Sample).

+1

0 еще лучше! – Armand

+1

@Armand Тогда последняя ссылка на образец должна быть тем, что вы хотите. :) – jpw

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