【问题标题】:Creating a Join Query for a one-to-many table relationship为一对多表关系创建联接查询
【发布时间】:2012-12-07 00:35:33
【问题描述】:

我有一个表 (Table D),它的字段与另一个表 (Table M) 关联,其中包含一组引用表 D 中的单行的行。

可以(如果可以,如何)我可以创建一个 SQL 查询,它不仅可以从 D 中选择字段,还可以与表 M 连接,返回所有行值(仅来自一列)单个结果列,但全部连接在一起(最好进行某种转义,以免被M 中的流氓数据污染)?

编辑:

+-----------+----------+-------------+
| DataRowID | DataName | RandomField |
+-----------+----------+-------------+
| 1         | Foo      | Alice       |
+-----------+----------+-------------+
| 2         | Bar      | Bob         |
+-----------+----------+-------------+
| 3         | Baz      | Charlie     |
+-----------+----------+-------------+


+-----------+-----------+-----------+
| MetaRowID | DataRowID | MetaValue |
+-----------+-----------+-----------+
| 1         | 1         | Mercury   |
+-----------+-----------+-----------+
| 2         | 1         | Venus     |
+-----------+-----------+-----------+
| 3         | 1         | Earth     |
+-----------+-----------+-----------+
| 4         | 2         | Mars      |
+-----------+-----------+-----------+
| 5         | 2         | Jupiter   |
+-----------+-----------+-----------+
| 6         | 3         | Saturn    |
+-----------+-----------+-----------+
| 7         | 3         | Uranus    |
+-----------+-----------+-----------+
| 8         | 3         | Neptune   |
+-----------+-----------+-----------+
| 9         | 3         | Pluto     |
+-----------+-----------+-----------+

Where DataName = 'Bar'被查询时,

+-----------+----------+-------------+--------------+
| DataRowID | DataName | RandomField | MetaData     |
+-----------+----------+-------------+--------------+
| 2         | Bar      | Bob         | Mars,Jupiter |
+-----------+----------+-------------+--------------+

【问题讨论】:

标签: mysql sql join one-to-many


【解决方案1】:

使用MySql的GROUP_CONCAT函数:

SELECT d.ID, GROUP_CONCAT(m.Field) AS ConcatFields
FROM d JOIN m ON d.ID = m.dID
GROUP BY d.ID

【讨论】:

  • 对于 GROUP_CONCAT,它如何将值粘合在一起?另外,假设它只使用,s,并且字段值中有一个,,它会被转义吗?
  • @cgoddard 默认分隔符是,,但您也可以将不同的分隔符传递给函数。它不会更改该字段中的任何现有数据,因此您需要在该字段中REPLACE 任何现有的,s。
  • 谢谢。我已经将stackoverflow.com/questions/452357/mysql-group-concat-escaping 视为此类事情的实现,您同意吗?
猜你喜欢
  • 2013-09-19
  • 1970-01-01
  • 2015-01-07
  • 2021-08-31
  • 2014-09-12
  • 1970-01-01
  • 2011-01-08
  • 1970-01-01
  • 2021-04-04
相关资源
最近更新 更多