2012-03-01 19 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

左結合を使用してください。レコードが存在しないGRADEにはNULLが返されます。データを提示するときは、nullの代わりにN/Aを入れてください。

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

か、あなたはN/Aの代わりに、ヌルをしたい場合は

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で実現できます。 – 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

これは、IFの代わりに `COALESCE`がより簡潔になるように、LEFT JOIN

関連する問題