【问题标题】:Retrieve all row data using a GROUP_CONCAT使用 GROUP_CONCAT 检索所有行数据
【发布时间】:2012-09-02 18:15:50
【问题描述】:

我在 mysql 中使用 GROUP_CONCAT() 从存储的 ID 列表中检索数据,如下所示:

**Table : Visitor**
ID   |  name  |  id_visited_place
--------------------------
1    |  tom   |  222,235,455


**Table : Places**
ID   |  Country  |  City     | Date
--------------------------------------
222  |  France   |  Paris    | 2010-08-11
235  |  Belgium  |  Antwerp  | 2009-04-24
455  |  Germany  |  Berlin   | 2009-03-17

问题是这个查询只返回一个字段:

SELECT visitor.*, GROUP_CONCAT(places.country) AS country FROM visitor
LEFT JOIN Places ON FIND_IN_SET(places.id, visitor.id_visited_place)
GROUP BY visitor.id

但是对于 id_visited_place 中的每个 ID,我想返回与该 ID 关联的每个字段,例如:“我在 2010- 08-11

【问题讨论】:

  • 如果DatePlaces 表中,如何知道它与哪个Visitor 相关?你真的应该规范化你的模式并创建一个(visitor_id, place_id, date_of_visit) 元组的表。除此之外,您是否追求过类似sqlfiddle 的东西?
  • 我的数据库并没有完全像这样建立起来。这只是一些基本布局来说明我正在尝试做的事情:获取与 GROUP_CONCAT 选择的行相关的所有数据

标签: mysql select field group-concat


【解决方案1】:

然后通过以下方式将组排除在外:

SELECT concat('I visited ', p.city, ', ', p.country, ' on ', date)
FROM visitor v left outer join
      Places p
      ON FIND_IN_SET(p.id, v.id_visited_place)
GROUP BY v.id

您的联接将行相乘以得到每个地点的单独行。然后 group by 将其减少到每个访问者一行。

也就是说,您的数据结构不应该为此目的使用集合。访问的地点数量可能会超过最大设置大小。此外,连接很难遵循并且不能利用索引。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-03-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-26
    相关资源
    最近更新 更多