2012-02-08 2 views
3

Я пытаюсь получить данные из двух связанных таблиц в одном запросе. Таблицы выглядеть следующим образом:Как получить данные из двух связанных таблиц?

Таблица 1:

-------------------------- 
| ID  | username | 
-------------------------- 
| 1   | user1  | 
| 2   | user2  | 
| 3   | user3  | 
| 4   | user4  | 
-------------------------- 

Таблица 2:

---------------------------------------------------- 
| ID  | user_id | key  | value  | 
---------------------------------------------------- 
| 1   | 1   | key1  | value1  | 
| 2   | 1   | key2  | value2  | 
| 3   | 2   | key2  | value3  | 
| 4   | 3   | key3  | value4  | 
| 5   | 4   | key1  | value5  | 
| 6   | 4   | key3  | value5  | 
---------------------------------------------------- 

Я хочу, чтобы получить результат, включая все строки из таблицы 1 и ключ-значение пары из таблицы 2 где key = key1. Если ключ отсутствует в таблице 1 для данной строки из таблицы 1, заполните его NULL. Ожидаемый результат Пример:

---------------------------------------------------- 
| user_id | username | key  | value  | 
---------------------------------------------------- 
| 1   | user1  | key1  | value1  | 
| 2   | user2  | NULL  | NULL  | 
| 3   | user3  | NULL  | NULL  | 
| 4   | user4  | key1  | value5  | 
---------------------------------------------------- 

В качестве альтернативы - все строки из таблицы 1, которые не содержат пары ключ-значение для ключа = key1 в таблице 2.

я попробовал стандартный SELECT от 2-х таблиц и SELECT из Таблица 1 с JOIN из таблицы 2, но все, что я получаю, это все строки из таблицы 1, содержащие пару «ключ-значение» с ключом = ключ1 в таблице 2, и это точно противоположно тому, что я хочу.

Любые предложения?

ответ

8
select 
     t1.id, 
     t1.username, 
     t2.key, 
     t2.value 
    from 
     table1 t1 
     left join table2 t2 
      on t1.id = t2.user_id 
      and t2.key = 'key1' 

Для вашего "Альтернатива", чтобы получить все, что НЕ есть, просто добавьте где пункт ..

where t2.user_id IS NULL 
1

Попробуйте это:

SELECT t1.username,t2.user_id,t2.key,t2.value FROM table1 as t1 left join table2 as t2 on(t1.id = t2.user_id) and t2.key = 'key' 
-1

запрос может выглядеть следующим образом :

SELECT t1.username, t2.key, t2.value FROM table1 AS t1 
LEFT OUTER JOIN table2 AS t2 ON t1.id = t2.user_id; 

Например, если существует n о user_id 3 в table2, то запрос (выше) будет производить:

+----------+------+--------+ 
| username | key | value | 
+----------+------+--------+ 
| user1 | key1 | value1 | 
| user1 | key2 | value2 | 
| user2 | key2 | value3 | 
| user3 | NULL | NULL | 
| user4 | key1 | value5 | 
| user4 | key3 | value5 | 
+----------+------+--------+ 
+0

он искал образец, который разрешен только определенный ключ = «key1», и в качестве альтернативы, как получить INVERSE (только те, которые Бесполезный «т). Вы видели мой ответ ... – DRapp

+0

О, я вижу. Благодарю. –

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