2014-10-28 145 views
0

假设这是可能的,我正在寻找一种方法(MYSQL查询)来连接表中没有任何返回的值重复。我想加入三张表(A,B,C)。这三个表中的公共列是user_id。 user_id在表A中将是唯一的 - 用户在表A中将只有一行/记录。但是,表B中的user_id将不唯一。C - 用户可能在两个表中有多个记录/行B & C. I已经试过INNER,LEFT,和RIGHT JOINS,以及UNION然而,它重复从表A的结果为:匹配从表B & C.需要一个mysql查询建议

Row 1: Value1(from A)  Value1(from B)  Value1(from C) 
Row 2: Value1(from A)  Value2(from B)  Value2(from C) 
Row 3: Value1(from A)  Value3(from B)  Value3(from C) 

我想避免这种结果。相反,我宁愿:

Row 1: Value1(from A)  Value1(from B)  Value1(from C) 
           Value2(from B)  Value2(from C) 
           Value3(from B)  Value3(from C) 
Row 2: Value2(from A)  Value1(from B)  Value1(from C) 
           Value2(from B)  Value2(from C) 
           Value3(from B)  Value3(from C) 

在此先感谢您的任何帮助。

+0

可能出现[预先在连接上选择不同记录](http://stackoverflow.com/questions/2068515/select-distinct-records-on-a-join) – undefined 2014-10-28 21:45:27

+3

的重复。你有显示问题,而不是查询问题。 – 2014-10-28 21:45:36

+0

为您的问题提供答案的一个问题是可能存在未确定的列数。你知道是否可以事先知道表B和C中任意用户的行数是否受到合理限制的限制? – 2014-10-28 21:54:07

回答

0

如果你的主要兴趣是在以各行返回所有在B和C的其他值,而你并没有大惊小怪的列数,那么下面可能是有用的:

SELECT A. F1,GROUP_CONCAT(B.F1)AS all_b_F1,GROUP_CONCAT(C.F1)AS all_c_F1 FROM A INNER JOIN B USING(user_id)INNER JOIN C USING(user_id)ORDER BY A.F1;

请注意,由于您未指定它们,因此我已经创建了字段名称。您可以为B和C中的其他字段添加其他GROUP_CONCAT列,或者在当前查询中一起添加CONCAT或CONCAT_WS以代替B.F1。

取决于你想要对结果做什么,这个查询可能是足够好的。例如,您可以在PHP中分解all_b_F1以获取个体值,或者使用FIELDS ENCLOSED BY''将查询结果从MySQL导出到csv,以便在将csv导入到Excel中时,B和C中的每个值都获得它们自己的单元格。