2012-06-28 63 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功能,但默认值应该是做工精细你想要的东西。