这是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')
);
答案 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.