2012-03-15 14 views
2

単純なMySQLテーブル:どのような種類のMySQL参加が必要ですか?テーブル間でID値が一致する

pid: 1 
firstname: fred 

各人物について複数表2のエントリがある:

table 1; 
pid, firstname 

table 2; 
id, pid, property, value 

表1に一個のエントリがあると言うことができます

pid: 1 
property: likes cats? 
value: no 

pid: 1 
property: eye colour 
value: orange 

pid: 1 
property: favourite food 
value: sox 

テーブルの2つのエントリのうち、アイカラーと特定の人物IDの食べ物のエントリを選択するだけです。どのような外部結合がこれを達成できますか?

SELECT `t1`.name 
FROM `table1` AS t1 
LEFT JOIN `table2` t2 ON `t1`.pid = `t2`.pid 
WHERE `t1`.pid = 1 
AND `t2`.property = 'eye colour' 

私はここでスタックされています。テーブル2から2行を取得する方法も好評です。 (誰もが言う前に、私はこのデータベースの構造を変更することはできません)。

読んでいただきありがとうございます。

+0

出力? –

+1

あなたがしようとしているのは、 "エンティティ属性値テーブルのピボット"です。 – biziclop

+0

ええ、誰もがそれを知っている、それは明らかではない; P – jwbensley

答えて

4

どのようなものについて:

SELECT t1.name, t2.property, t2.value 
FROM table2 t2 
INNER JOIN table1 t1 ON t1.pid = t2.pid 
WHERE t2.pid = 1 
AND t2.property IN ('eye colour','favourite food') 

やMySQLはそれをインデックス化しかし、あなただけの最初の二つを望んでいた:

SELECT t1.name, t2.property, t2.value 
FROM table2 t2 
INNER JOIN table1 t1 ON t1.pid = t2.pid 
WHERE t2.pid = 1 
LIMIT 2 

を常にあるはずなので、ここでJOINをLEFTを使用する本当の理由は、ありません関連するpidtable1で定義されます。

+1

私はあなたの最初の答えが好きです、これは良いものです! :)また、はい、それはここでインナーになるはずです。ありがとう! – jwbensley

-1

これを1つのクエリで実行する場合は、INNER JOINを使用する必要がありますが、これを推奨していません。もし私があなたなら私は最初に人を選択し、必要なtable2エントリを受け取るために別のクエリを作成します。私のソリューションの両方を試してみてください。

2

これはいかがですか?

SELECT t.name, t.value, t3.value 
FROM 
(SELECT t1.name, t2.value, t1.pid 
FROM table1 t1 
LEFT JOIN table2 t2 ON t1.pid = t2.pid 
WHERE t1.pid = 1 
AND t2.property = 'eye colour') t 
LEFT JOIN table2 t3 ON t.pid = t3.pid 
WHERE t.pid = 1 
AND t3.property = 'favourite food' 

また、これはあなたが二回参加残さする必要がある「目の色」や「好きな食べ物」エントリ

+0

クエリに構文エラーがありますが、一般的な考えは正しいです。 SELECT-FROM-JOIN - WHERE ..... ** not:(select-from-join-where-join-where)**エイリアス識別子にスペースを入れることはできません。 – Johan

+0

@Johan特別な文字を削除しました。ありがとう! –

+0

Amit、それは正しい(唯一の)正確な部分でした。(実際には必要ありませんが) – Johan

5

を持っていない人のために働くだろう。このクエリを何

SELECT 
    t1.name 
    ,t2a.value as eye_color 
    ,t2b.value as fav_food 
FROM table1 t1 
LEFT JOIN table2 t2a ON (t1.pid = t2a.pid AND t2a.property = 'eye colour') 
LEFT JOIN table2 t2b ON (t1.pid = t2b.pid AND t2b.property = 'fav food') 
WHERE t1.pid = 1 
+0

+1。 ORを使うのではなく、テーブルに2回参加することに決めた理由は不思議です。 –

+1

@Ben、私はテーブルをピボットしているので。私が 'または'を使用していれば、pidごとに複数の行がありますが、今はpidごとに1行しかありません。 – Johan

+0

ああ、気づかなかった。ありがとう。 –

関連する問題