2010-01-26 63 views
2

这是对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,与Table 3只是不同的a_name
现在,是否有可能让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 
); 
+1

SQL上没有任何数组数据类型 - 请发布您的预期输出应该是什么样子的示例。听起来像GROUP_CONCAT ... – 2010-01-26 23:25:23

+0

我建议你*不*执行此操作。您的原始查询很好,并且是推荐的方法。 – 2010-01-26 23:42:48

+0

@Mark Byers:我意识到潜在的隐患。我只是想知道如何减少从应用程序到数据库的连接数量,并直接从中获得更多的细节结果。 – 2010-01-26 23:54:24

回答

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. 
+0

谢谢。这对我来说足够好了!不胜感激! – 2010-01-26 23:38:23

+0

虽然一个观察。这种解决方案只适用于一行。如果我们摆脱'WHERE'子句,它将不会产生有效的结果。 – 2010-01-27 00:44:19

+1

@Michal M:它缺少一个“GROUP BY”子句。 MySQL有着无限的智慧,允许省略来自GROUP BY的列,并且仍在工作 - 我没有意识到其他数据库允许这样做,并导致痛苦(有很多“为什么这个工作在MySQL上而不是DB XYZ上...“在SO上)。您需要在“GROUP BY”中列出未包含在聚合函数(本例中为GROUP_CONCAT)的每列。以下是关于缺失列的MySQL页面:http://dev.mysql.com/doc/refman/5.0/en/group-by-hidden-columns.html – 2010-01-27 01:53:17

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允许这样做,并且这样的查询不会移植到其他数据库(这里有很多示例)。

我在GROUP_CONCAT中添加了不同的内容 - 没有想到如果存在任何重复内容。