【问题标题】:MySQL select all from 3 tables different amount of rowsMySQL从3个不同行数的表中选择所有
【发布时间】:2012-10-18 19:33:58
【问题描述】:

我想检索所有成员和所有成员船的列表。 我这样做的方式是获取会员拥有的每艘船的会员信息。因此,如果成员 John Smith 有 3 艘船,则显示 John Smith 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

【问题讨论】:

  • 您如何确定要为 John Smith 展示哪条船?
  • 这是一个显示要求,应该在您的 UI 层中处理,而不是在您的数据库结果集中。
  • 好吧,但是用 sql 可以吗?
  • 您是否尝试过使用 distinct 关键字?或者 Group by 可能会起作用
  • @user1121487:不,这在 SQL 中是不可能的。

标签: mysql left-join inner-join


【解决方案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】:

如果我理解您的要求,Mysql 不可能生成这种类型的查询:

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

正如评论中的注释,这种类型的分组是在您取回数据后在显示端完成的。

【讨论】:

  • 是的,这就是我想要的。好的..我认为它可能。我想我是在 MS SQL 中做到的。谢谢。
【解决方案3】:

添加 group by 子句。

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

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

【讨论】:

  • 但是 OP 需要 所有 在他的结果集中返回的船。
  • ONE 栏中的所有船?像:1 John Smithboat1,boat2,boat3 这有点难做,但这可能会有所帮助:stackoverflow.com/questions/10461874/…
  • 没有。如果这就是他想要的,他也许可以利用GROUP_CONCAT,因为他使用的是 MySQL。
猜你喜欢
  • 2020-02-22
  • 1970-01-01
  • 2016-08-25
  • 2017-07-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-14
  • 1970-01-01
相关资源
最近更新 更多