数据库返回多维结果

时间:2010-01-26 23:20:39

标签: sql mysql database join multidimensional-array

这是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_name的{​​{1}}不同。
现在,我可以使Table 3成为一个数组(在这种情况下是3个单元格)吗?我认为这是不可能的。如果不是,我将如何构建查询以便它只返回一行,a_name结果与给定的'glue'字符串连接?


修改 如果我要在PHP中得到一个结果,我会期望类似:

a_name

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

2 个答案:

答案 0 :(得分: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中添加了不同内容 - 如果存在重复,我认为你不想重复。

答案 1 :(得分: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.