2011-11-05 49 views
1

我不知道這是可能的,但有沒有在MySQL的方式產生,其中一個一對多表的多個結果聯接可被設置爲在一個陣列中的單個查詢一個項目的結果的關鍵?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具有與在表中的一個條目的條目。

如果我運行下面的查詢:

SELECT a.*, b.* FROM a, b WHERE b.id_a = a.id_a AND a.id_a = x; 

我會得到與重複單項ID x的數據的多個條目的數組。我真正想要的是從表a定義爲b其中包含多個匹配條目從表b數組的一個關鍵返回一行。我懷疑這僅僅是一個查詢是不可能的,但如果是這樣的話,它會很好。目前我正在PHP中進行以下操作(其中$ this - > _ db是一個Zend Framework數據庫適配器)。這將運行很多查詢!:

$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']); 
} 

或者我可以用我原來的連接查詢和提交過程,我懷疑是更有效的,但意味着我需要通過我需要明確地列複製(疼痛和遠離優雅):

$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; 
} 

回答

1

您的查詢使用隱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 
+0

謝謝,這正是我所追求的。 – baseten

0

你可能會尋找一個ORM(對象關係映射器),這將處理對象之間的關聯,將能夠返回之一的含B對象的數組對象。

Good PHP ORM Library?

使用顯式連接,查詢應該是這樣的:

SELECT a.*, b.* FROM a inner join b on b.id_a = a.id_a where a.id_a = x; 
+0

謝謝,我覺得一個ORM庫是太多這個特定的項目,但它絕對東西,我會進一步研究。也感謝顯式連接查詢。 – baseten