我不知道这是否可能,但在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的数据。实际上,我需要的是从tablea返回的一行,键定义为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

10-08 17:15