【问题标题】:Database to return multi-dimensional result数据库返回多维结果
【发布时间】:2011-01-09 18:01:19
【问题描述】:

这是my previous one 的后续问题。
情况:

Table 1:
+--------------------+--------------------+
|               v_id |             v_name |
+--------------------+--------------------+
|                  1 |            v_name1 |
+--------------------+--------------------+
| etc...

Table 2:
+--------------------+--------------------+
|               a_id |             a_name |
+--------------------+--------------------+
|                  1 |            a_name1 |
+--------------------+--------------------+
| etc...

Table 3:
+--------------------+--------------------+
|               v_id |               a_id |
+--------------------+--------------------+
|                  1 |                  1 |
+--------------------+--------------------+
|                  1 |                  2 |
+--------------------+--------------------+
|                  1 |                  3 |
+--------------------+--------------------+

我想连接两个表:

SELECT t1.*, t2.a_name
FROM `table1` t1
LEFT JOIN `table_3` t3 ON t3.v_id = t1.v_id
LEFT JOIN `table_2` t2 ON t2.a_id = t3.a_id
WHERE t1.id = 1;

此查询的结果将是给定表的 3 行,每行的值与 Table 1 相同,只是 a_nameTable 3 不同。
现在,我是否可以将a_name 设为一个数组(在这种情况下为 3 个单元格)?我认为这是不可能的。如果不是,我将如何构建查询以便它只返回一行,a_name 结果与给定的“胶水”字符串连接?


编辑 如果我要在 PHP 中得到结果,我会期待这样的结果:

$result = array(
    'v_id'    => 1,
    'a_name'  => array('a_name1', 'a_name2', 'a_name3')
);

$result = array(
    'v_id'    => 1,
    'a_name'  =>'a_name1, a_name2, a_name3'), # assuming I used ', ' as the glue string
);

【问题讨论】:

  • SQL 上没有任何数组数据类型 - 请发布一个示例,说明您的预期输出应该是什么样子。听起来像 GROUP_CONCAT...
  • 我建议你不要实现这个。您的原始查询很好,是推荐的方法。
  • @Mark Byers:我知道潜在的陷阱。我只是想知道如何减少从应用程序到数据库的连接数量并直接从中获取更多详细信息。
  • 好吧...没关系 - 你比我更了解你的问题,所以我不知道什么最适合你。祝你好运,注意名称中的逗号。

标签: sql mysql database join multidimensional-array


【解决方案1】:

我相信您正在寻找GROUP_CONCAT 函数。

在您的查询中,它看起来像这样:

SELECT t1.*, GROUP_CONCAT(t2.a_name SEPARATOR ',')
FROM `table1` t1
LEFT JOIN `table_3` t3 ON t3.v_id = t1.v_id
LEFT JOIN `table_2` t2 ON t2.a_id = t3.a_id
WHERE t1.id = 1
GROUP BY [list of t1 columns here] 
-- update thanks to OMG Ponies.

【讨论】:

  • 谢谢。这对我来说足够好!赞赏!
  • 一个观察结果。此解决方案仅适用于一行。如果我们去掉WHERE 子句,它将不会产生有效的结果。
  • @Michal M:它缺少GROUP BY 子句。 MySQL,以其无限的智慧,允许从GROUP BY 中省略列并且仍然工作 - 我知道没有其他数据库允许这样做,并导致痛苦(有很多“为什么这在 MySQL 而不是 DB XYZ. ..”在SO上)。您需要在GROUP BY 中列出未包含在聚合函数(本例中为 GROUP_CONCAT)中的每一列。这是关于缺失列的 MySQL 页面:dev.mysql.com/doc/refman/5.0/en/group-by-hidden-columns.html
  • @Michal 和@OMG Ponies:更新。谢谢你的收获!
【解决方案2】:

用途:

    SELECT t1.*, 
           GROUP_CONCAT(DISTINCT t2.a_name SEPARATOR ',')
     FROM `table1` t1
LEFT JOIN `table_3` t3 ON t3.v_id = t1.v_id
LEFT JOIN `table_2` t2 ON t2.a_id = t3.a_id
   WHERE t1.id = 1
 GROUP BY [list of t1 columns here]

Sean Viera 的答案正如您所指出的那样有效,因为WHERE 子句和MySQL allows for columns to be omitted from the GROUP BY。这不是一个好习惯——只有 MySQL 允许这样做,并且此类查询不会移植到其他数据库(SO 上有很多示例)。

我在 GROUP_CONCAT 中添加了 distinct - 如果存在重复项,我认为您不想要。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-05-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多