我不知道这是否可能,但在MySQL中是否有一种方法可以生成一个查询,其中一对多表联接的多个结果可以设置为一个项的结果键上的数组?
我意识到这个问题不是很清楚,所以我会进一步解释我的想法:
首先,我目前正在使用隐式连接,想了解更多关于显式连接的信息(目前我对其了解甚少),也许这些可以提供我正在寻找的答案?
例如,给出两个表:
CREATE TABLE `a` (
`id_a` int(11) NOT NULL AUTO_INCREMENT,
`a_column1` varchar(255) NOT NULL,
...
PRIMARY KEY (`id_a`)
)
CREATE TABLE `b` (
`id_b` int(11) NOT NULL AUTO_INCREMENT,
`id_a` int(11) NOT NULL,
`b_column1` varchar(255) NOT NULL,
...
PRIMARY KEY (`id_b`)
)
其中表b有许多条目与表a中的单个条目相关。
如果要运行以下查询:
SELECT a.*, b.* FROM a, b WHERE b.id_a = a.id_a AND a.id_a = x;
我将得到一个包含多个条目的数组,其中重复了单个条目id x的数据。实际上,我需要的是从table
a
返回的一行,键定义为b
,其中包含来自tableb
的多个匹配项数组。我怀疑单靠查询是不可能做到这一点的,但如果是这样的话就太好了。目前,我正在PHP中执行以下操作(其中$this->\u db是一个Zend框架数据库适配器)。这会运行很多查询!:$query = "SELECT * FROM a WHERE id_a = ?";
$items = $this->_db->fetchAll($query, $id);
foreach($items as $key => $item) {
$query = "SELECT * FROM b WHERE id_a = ?";
$items[$key]['b'] = $this->_db->fetchAll($query, $item['id']);
}
或者,我可以使用我原来的连接查询和post进程,我怀疑这更有效,但这意味着我需要显式地复制我需要的列(这是一种痛苦,远远不够优雅):
$query = "SELECT * FROM a, b WHERE a.id_a = b.id_a AND a.id_a = ?";
$items = $this->_db->fetchAll($query, $id);
$output = array('a_column1' => $items[0]['a_column1'], etc...);
$output['b'] = array();
foreach($items as $item) {
$b = array('b_column1' => $item['b_column1'], etc...);
$output['b'][] = $b;
}
最佳答案
使用隐式JOIN
的查询:
SELECT a.*
, b.*
FROM a, b
WHERE b.id_a = a.id_a
AND a.id_a = x
使用显式
JOIN
:SELECT a.*
, b.*
FROM a
JOIN b
ON b.id_a = a.id_a
WHERE a.id_a = x
在一个查询中包含数据的一种方法是使用
GROUP_CONCAT()
函数。但它可能不是您可以使用的格式:SELECT a.*
, GROUP_CONCAT( b.id_b
ORDER BY b.id_b ASC
SEPARATOR ','
) AS b_ids
, GROUP_CONCAT( b.b_column1
ORDER BY b.id_b ASC
SEPARATOR ','
) AS b_column1s
, ... --- etc
FROM a
JOIN b
ON b.id_a = a.id_a
WHERE a.id_a = x
GROUP BY a.id_a