2015-03-29 2 views
2

У меня есть таблица test, которая выглядит следующим образом:Список всех ассоциированных имен из указанной таблицы?

+-------+-------+ 
| u1_id | u2_id | 
+-------+-------+ 
|  1 |  2 | 
|  3 |  1 | 
|  2 |  1 | 
|  2 |  3 | 
+-------+-------+ 

И, u1_id и u2_id являются «внешние ключи» к другой таблице user:

+----+-------+ 
| id | name | 
+----+-------+ 
| 1 | n_foo | 
| 2 | n_bar | 
| 3 | n_baz | 
+----+-------+ 

Не знаю, как это объяснить, но :

  • На входе у меня есть один пользователь id, на который можно ссылаться в u1_id или в u2_id.
  • Я хотел бы получить связанного с ним пользователя, как определено в таблице test, используя соединение по таблице user.

Для пользователя id = 1, я должен получить:

n_bar 
n_baz 
n_bar 

Для пользователя id = 2, я должен получить:

n_foo 
n_foo 
n_baz 

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

  • u1_id, если мой пользовательский ввод id в u2_id колонке
  • u2_id иначе

Я пытался что-то вроде этого, но это не похоже на работу:

SELECT name 
FROM test 
    JOIN user 
    ON user.id = test.u1_id 
WHERE test.u1_id = @guid OR 
     test.u2_id = @guid AND 
     CASE 
     WHEN test.u2_id = @guid 
     THEN test.u2_id = test.u1_id 
     END; 

Любые идеи, как этого добиться? Или, может быть, есть лучший способ разработать эти таблицы, я полностью открыт для любых предложений.

+0

См. СОЮЗ [ВСЕ]. И дайте нам знать, как вы поживаете. – Strawberry

+0

Вы хотите дублировать результат? –

ответ

1

Если я правильно понял ваш вопрос, я считаю, нужно следующий запрос:

SELECT t2.`name` 
FROM `t2` 
INNER JOIN (
    SELECT IF(@uid = 1, t1.u1_id, t1.u2_id) as `id` 
    FROM `t1` 
) as `t1` 
WHERE t2.id = t1.id and t1.id != @uid; 

Я попробовал следующее:

Базовая дата создания, я не» t знать, какие типы столбцов используются только для демонстрации:

create table t1 (
    u1_id int, 
    u2_id int 
); 
insert into t1 values 
(1, 2), 
(3, 1), 
(2, 1), 
(2, 3); 

create table t2 (
    id int, 
    name varchar(10) 
); 
insert into t2 values 
( 1 , 'n_foo'), 
( 2 , 'n_bar'), 
( 3 , 'n_baz'); 

Тогда запросы:

mysql> SELECT * FROM t1; 
+-------+-------+ 
| u1_id | u2_id | 
+-------+-------+ 
|  1 |  2 | 
|  3 |  1 | 
|  2 |  1 | 
|  2 |  3 | 
+-------+-------+ 
4 rows in set (0.00 sec) 

mysql> SELECT * FROM t2; 
+------+-------+ 
| id | name | 
+------+-------+ 
| 1 | n_foo | 
| 2 | n_bar | 
| 3 | n_baz | 
+------+-------+ 
3 rows in set (0.00 sec) 

mysql> SET @uid = 1; 
Query OK, 0 rows affected (0.00 sec) 

mysql> SELECT @uid; 
+------+ 
| @uid | 
+------+ 
| 1 | 
+------+ 
1 row in set (0.00 sec) 

mysql> SELECT t2.`name` 
    -> FROM `t2` 
    -> INNER JOIN (
    ->  SELECT IF(@uid = 1, t1.u1_id, t1.u2_id) as `id` 
    ->  FROM `t1` 
    ->) as `t1` 
    -> WHERE t2.id = t1.id and t1.id != @uid; 
+-------+ 
| name | 
+-------+ 
| n_baz | 
| n_bar | 
| n_bar | 
+-------+ 
3 rows in set (0.03 sec) 

mysql> SET @uid = 2; 
Query OK, 0 rows affected (0.00 sec) 

mysql> SELECT @uid; 
+------+ 
| @uid | 
+------+ 
| 2 | 
+------+ 
1 row in set (0.00 sec) 

mysql> SELECT t2.`name` 
    -> FROM `t2` 
    -> INNER JOIN (
    ->  SELECT IF(@uid = 1, t1.u1_id, t1.u2_id) as `id` 
    ->  FROM `t1` 
    ->) as `t1` 
    -> WHERE t2.id = t1.id and t1.id != @uid; 
+-------+ 
| name | 
+-------+ 
| n_foo | 
| n_foo | 
| n_baz | 
+-------+ 
3 rows in set (0.00 sec) 

Btw, вы можете изменить условия соединения, если это не то, что вы хотели. Но поскольку он дает правильные результаты ...

Дайте ему попробовать!

1

Использование схемы GrijeshChauhan ...

SELECT * FROM 
(SELECT u1_id,u2_id FROM t1 
UNION ALL 
SELECT u2_id,u1_id FROM t1 
) x 
JOIN t2 
    ON t2.id = x.u1_id 
WHERE x.u2_id = 2; 
+-------+-------+------+-------+ 
| u1_id | u2_id | id | name | 
+-------+-------+------+-------+ 
|  1 |  2 | 1 | n_foo | 
|  1 |  2 | 1 | n_foo | 
|  3 |  2 | 3 | n_baz | 
+-------+-------+------+-------+