2011-07-22 7 views
5
table a 
------------------------------------------------- 
id name  wishlist1 wishlist2  wishlist3 

1 john  1    2   3 
2 paul  4    5 


table b 
-------------------------------------------------- 
id goods 

1  car 
2  aircraft 
3  bicycle 
4  motorbike 
5  ipad 


result i want to get 
--------------------------------------------------- 
john car  aircraft bicycle 
paul motorbike ipad 

この結果はどうやって得ることができますか? (mysqlで)mysql join problem

+0

すべての答えはあなたの問題に十分です。ホープ今すぐ参加することができます...... ......! –

答えて

5

これは

select 
    name, 
    g1.goods as wish1, 
    g2.goods as wish2, 
    g3.goods as wish3 
from tablea a 
left join tableb g1.id on g1.wishlist1 
left join tableb g2.id on g1.wishlist2 
left join tableb g3.id on g1.wishlist3 

(彼らは希望を持っていない願い列にヌルで)3希望までの出力します210

これはしかし良いかもしれない、とあなたが希望のカンマ区切りリスト気にしない場合には、すっきりです:

select 
    name, 
    group_concat(goods) as wishes 
from tablea a 
left join tableb b on b.id in (a.wishlist1, a.wishlist2, a.wishlist3) 
group by name; 

の出力は以下となります。

name | wishes 
------|---------------------- 
john | car,aircraft,bicycle 
paul | motorbike,ipad 
3

これは良いDBデザインではありません。ユーザーが複数のウィッシュリストに表示されるように、複数の彼のウィッシュリスト内の要素と要素を持つことができるように、あなたは成功したモデルは、n個の関係にしていますこのように

table a_b 
----------- 
id_a int 
id_b int 

あなたのようなintermadiaryテーブルを作成する必要があります

+0

私はあなたがこれを試していないと仮定しています... – gbn

+0

@gbn - あなたは正しいです - 私はそれを試していません - あなたのクエリは正しいですが、彼は考慮して考慮することができますdb –

3
SELECT 
    a.name, 
    b1.goods, 
    b2.goods, 
    b3.goods 
FROM 
    a 
    LEFT JOIN 
    b AS b1 ON a.wishlist1 = b1.id 
    LEFT JOIN 
    b AS b2 ON a.wishlist2 = b2.id 
    LEFT JOIN 
    b AS b3 ON a.wishlist3 = b3.id 

をあなたの場合常に3つのウィッシュリストアイテムを持っていれば、これはちょうどOKです。ウィッシュリストアイテムの数を増やしたい場合は、別のテーブルを使用し、行として格納する方がよいでしょう。 First Normal Form

3

これは通常、悪い考えです。私は次のようにテーブルを構成勧め:

person 
pid name 
--- ---- 
1 john 
2 paul 

good 
gid item 
--- --------- 
1 car 
2 aircraft 
3 bicycle 
4 motorbike 
5 ipad 

person_wants_good 
pid gid 
--- --- 
1 1 
1 2 
1 3 
2 4 
2 5 

次に、あなたが望む結果を得るために、次のクエリを使用します。これは、次の表を返します

SELECT p.name, g.good 
    FROM person_wants_good 
    JOIN person USING (pid) 
    JOIN good USING (gid) 

を:

name good 
---- --------- 
john car 
john aircraft 
john bicycle 
paul motorbike 
paul ipad 

この情報をクロス集計された方法で提示するのは、お客様のクライアントコード次第です。