2012-03-01 2 views
0

У меня есть следующие таблицы базы данных:MySQL Как правильно выполнить этот подзапрос?

People 
+--------+------------+------------+-----------+ 
| f_ID | F_NAME | STUFF | F_VALUE | 
+--------+------------+------------+-----------+ 
| 1 | Zoe  | blah |  101 | 
| 2 | Jimy  | derka |  202 | 
| 3 | Kate  | shazam |  20 | 
| 4 | Sue  | pow  |  2 | 
+--------+------------+------------+-----------+ 

RESULTS 
+------- ---+------------+ 
| F_ID  | RESULTS | 
+-----------+------------+ 
| 1   |  Good | 
| 4   |  OK | 
+-----------+------------+ 

Как создать запрос для отображения всех записей в таблице людей, как это:

+------------+------------+ 
| NAME  | GRADE | 
+------------+------------+ 
| Zoe  |  Good | 
| Jimy  |  N/A | 
| Kate  |  N/A | 
| Sue  |  OK  | 
+------------+------------+ 

Я попробовал этот запрос, но он не работает правильно :

SELECT 
NAME 
GRADE 
(
SELECT 
p.F_NAME AS NAME, 
r.RESULTS 

FROM People p 
JOIN RESULTS r ON r.F_ID=p.F_ID 

UNION 

SELECT 
p.F_NAME AS NAME, 
"N/A" 

FROM People p 
JOIN RESULTS r ON r.F_ID=p.F_ID 
)a 

ответ

2

Вы должны использовать левое соединение. Вы получите NULL для GRADE, где записей не существует. Представляя данные, просто поместите N/A вместо null.

select People.F_NAME as NAME, RESULTS.RESULTS AS GRADE 
from People left join RESULTS ON People.f_ID = RESULTS.f_ID 

или, если вы хотите N/A вместо нулевой, используйте IF

select People.F_NAME as NAME, IF(RESULTS.RESULTS is NULL, 'N/A', RESULTS.RESULTS) AS GRADE 
from People left join RESULTS ON People.f_ID = RESULTS.f_ID 

или с помощью COALESCE (спасибо @bfavaretto)

select People.F_NAME as NAME, COALESCE(RESULTS.RESULTS, 'N/A') AS GRADE 
from People left join RESULTS ON People.f_ID = RESULTS.f_ID 
+0

+1, но 'COALESCE' вместо IF будет более кратким. – bfavaretto

+0

@bfavaretto Не могли бы вы показать пример этого. Я не уверен, слышал ли я когда-нибудь о COALESCE. Спасибо – stackoverflow

+0

@bfavaretto Согласен, обновил ответ. –

1

Может быть достигнуто с объединением

SELECT people.f_name, IF(results.grade <> 0, results.grade, 'N/A') from people 
JOIN results USING(f_id) 
1

без использования UNION, вы можете добиться этого с помощью LEFT JOIN

SELECT a.F_Name, 
     COALESCE(b.Results, 'N/A') Grade 
FROM People a LEFT JOIN Results b ON 
      a.f_IF = b.F_ID