2011-07-22 157 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连接问题

+0

所有的答案都足以解决你的问题。希望现在加入对你来说很清楚......! –

回答

5

这个输出功率可达3个愿望(与愿望列空值时,他们没有一个愿望)

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 

这可能会更好,虽然,它的整洁,如果你不介意以逗号分隔的愿望清单:

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

这不是一个好的数据库设计。这样你会成功的模式是到n的关系

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

,使用户可以在自己的心愿多个元素和元素出现在多个心愿:

您应该创建一个intermadiary表像

+0

我假设你还没有试过这个...... – gbn

+0

@gbn - 你是对的 - 我没有尝试过 - 你的查询是正确的 - 但是,他可以考虑重新设计数据库的建议 –

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个愿望清单项目,那么这就好了。如果您想扩展愿望清单项目的数量,那么您最好使用单独的表格并将其存储为行。见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 

然后,为了得到你想要的结果,请使用以下查询:

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

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

这将在下表中返回然后由您的客户代码以交叉列表的方式呈现这些信息。