MySQL从3个表中选择所有不同的行数

时间:2012-10-18 19:33:59

标签: mysql left-join inner-join

我想检索所有成员和所有成员船的列表。 我这样做的方式我得到了每个船员的成员信息。因此,如果一名成员约翰史密斯有3艘船,约翰史密斯将展示3次。 我希望名称和信息显示一次,并且空列而不是与船一起重复。

SELECT m.memberId, m.fName, m.lName, m.ssn, b.boatId, b.length, bt.type
FROM member AS m
RIGHT JOIN boat AS b
ON m.memberId = b.memberId
INNER JOIN boatType AS bt
ON b.boatTypeId = bt.boatTypeId

3 个答案:

答案 0 :(得分:1)

如果我理解你要求的内容,在Mysql中不可能生成这种类型的查询:

 Owner 1 details, boat 1 details
                  boat 2 details
                  boat 3 details
 Owner 2 details, boat 4 details
                  boat 5 details

在评论中注意,在您取回数据后,此类分组在显示方面完成。

答案 1 :(得分:1)

正如Joe建议的那样,您可以在MySQL中使用GROUP_CONCAT和CONCAT函数,就像这样。

   SELECT m.memberId, m.fName, m.lName, m.ssn, 
          GROUP_CONCAT(CONCAT(b.boatId, '(', bt.type, ':',b.length,' ft.)')
                       ORDER BY bt.boatId SEPARATOR '; ')
     FROM member AS m
LEFT JOIN boat AS b ON m.memberId = b.memberId
     JOIN boatType AS bt ON b.boatTypeId = bt.boatTypeId
 GROUP BY m.memberId, m.fName, m.lName, m.ssn

这会给你这样的行。

1 Larry Ellison 123-45-6789 USA 17(Americas Cup:113 ft.); Rising Sun(Diesel:453 ft.)
2 Ollie Jones 987-65-4321 Scruffy Guppy(Sunfish:12 ft.)

答案 2 :(得分:0)

添加group by子句。

GROUP BY m.member id, m.fName, m.lName, m.ssn

至于boatId,长度和类型字段,您必须决定应显示3艘船的ID长度和类型中的哪一个(使用您的示例)。