2012-06-28 61 views
2

我有兩個包含一個公共字段的表。 下面是這兩個表的結構是如何用於合併兩個表以獲得單個結果的MySQL查詢

表1

+--ID--+--Title----+----others---+ 
| 123 | Title 1 | other values| 
| 124 | Title 2 | other values| 
| 125 | Title 3 | other values| 
| 126 | Title 4 | other values| 
+------+-----------+-------------+ 

表2

+--ID--+--Tag ID--+----others---+ 
| 123 | 11  | other values| 
| 123 | 12  | other values| 
| 123 | 13  | other values| 
| 123 | 14  | other values| 
| 124 | 15  | other values| 
| 124 | 16  | other values| 
| 125 | 17  | other values| 
| 126 | 18  | other values| 
+------+----------+-------------+ 

我想表明第ID 1234 tags即11,12,13 & 14像以下表格

+--Article ID--+--Article Title--+--Tags--+--Tag IDs------+ 
|  123  | Title 1  | 4 | 11, 12, 13, 14| 
|  124  | Title 2  | 2 |  15, 16 | 
|  125  | Title 3  | 1 |  17  | 
|  126  | Title 4  | 1 |  18  | 
+--------------+-----------------+--------+---------------+ 

我對PHP和MySQL非常陌生,並試圖學習它。

有人請幫我瞭解我如何能得到理想的結果。

+0

請向我們展示您的代碼並告訴我們您的錯誤。 –

+1

GROUP_CONCAT將成爲您的朋友 –

+0

提示:使用[GROUP_CONCAT](http://dev.mysql.com/doc/refman/5.0/en/group-by-functions.html) –

回答

1
SELECT t1.id AS 'Article ID', 
t1.title AS 'Article Title', 
count(t2.tag_id) AS 'Tags', 
GROUP_CONCAT(t2.Tag_Id order by t2.Tag_id ASC) AS `Tag IDs` 
FROM table1 t1 
JOIN table2 t2 ON (t1.id = t2.id) 
GROUP BY t1.id; 

希望這個作品!

+0

這將按升序排列標籤ID! – Vimalnath

+0

你的回答非常好,它工作得非常好,我只是有更多的要求,即我在表2中有更多的列,也想獲取這些字段的數據。你能幫我多一點嗎?我現在得到的數組就像這個'object(stdClass)#418(4){ [「Article ID」] => string(4)「6510」 [「Article Title」] => string 10)「My Article Title」 [「Tags」] => string(1)「5」 [「Tag IDs」] => string(26)「139,140,​​141,142,143」' – Anuj

+0

我想我剛剛拿到了..但它並不完整。我已經在上面的代碼中的'line 2'之後添加了像't2.active AS'active'這樣的行。問題是,當我'var_dump()'數組中的所有數據都被合併,只有第一行的值顯示出來。 – Anuj

0

合併表是通過使用JOIN(左,右內部)關鍵字完成的。例如:

SELECT T1.*, T2.*, COUNT(T2.ID) AS TAG_COUNT, GROUP_CONCAT(T2.ID) AS TAG_IDS 
FROM TABLE1 T1 
LEFT OUTER JOIN TABLE2 T2 
ON T1.TAG_ID = T2.ID 

這種類型的連接結構表明,您有一個共同的字段,通過該字段進行連接本身。 在你的表格結構中,我假設,第一個表格T1是Article表格,第二個是Tags表格。在這種情況下,您需要在T1表中有一個字段,它對應於T2中的字段,這很可能是ID。

編輯:作爲最後一步,您需要連接結果以達到所需的結構,正如許多答案所述 - 使用GROUP_CONCAT()函數。

+0

這不會給OP想要的... –

0
SELECT table1.*, 
     table2.tagidgroup 
FROM table1 
     INNER JOIN (SELECT id, 
          Group_concat(tagid SEPARATOR ',' ) AS tagidgroup 
        FROM table2 
        GROUP BY id) Table2 
       ON table1.id = Table2.id 
2

此查詢應該工作(與一些調整)。

SELECT `ID` AS `t1`.`Article ID`, `t2`.`Title` AS `Article Title`, COUNT(`t2`.`ID`) AS `Tags`, 
GROUP_CONCAT(`t2`.`ID`) AS `Tag IDs` FROM `Articles` AS `t1` 
LEFT JOIN `Tags` AS `t2` ON `t1`.`ID` = `t2`.`ID` 
GROUP BY `t1`.`ID` 

有一對夫婦的其他選項的GROUP_CONCAT功能,但默認值應該是做工精細你想要的東西。