2016-06-22 73 views
3

这是我的表动物:如何组合GROUP_CONCAT和LEFT JOIN?

╔══════════╦══════╗ 
║ animal ║ id ║ 
╠══════════╬══════╣ 
║ dog ║ 1 ║ 
║ cat ║ 4 ║ 
║ cat ║ 3 ║ 
║ bird ║ 1 ║ 
╚══════════╩══════╝ 

这是我的表名:

╔═══════╦══════╗ 
║ id2 ║ name ║ 
╠═══════╬══════╣ 
║ 1 ║ alan ║ 
║ 2 ║ bob ║ 
║ 3 ║ john ║ 
║ 4 ║ sam ║ 
╚═══════╩══════╝ 

这是我期望的结果:

╔══════════╦═════════════╗ 
║ dog ║ alan  ║ 
║ cat ║ sam,john ║ 
║ bird ║ alan  ║ 
╚══════════╩═════════════╝ 

我试过这个解决方案:

$sql = ' 
    SELECT n.*, 
    x.grouped_name FROM names n 
    LEFT JOIN (SELECT a.id, 
    GROUP_CONCAT(a.animals) AS grouped_name FROM animals a GROUP BY a.id) x 
    ON x.id = n.id2'; 

    foreach ($pdo->query($sql) as $row) { 
      echo '<td>'.$row['animal'].' </td>'; 
      echo '<td>'.$row['grouped_name'].' </td>'; 
    } 

但我没有得到结果。

我也试过这个解决方案:

$sql = ' SELECT n.*, (SELECT GROUP_CONCAT(a.id) FROM animals a WHERE a.id = n.id2) AS grouped_name FROM names n'; 

但我的结果是这样的:

╔══════════╦═════════════╗ 
║   ║ 1,1   ║ 
║   ║ 3   ║ 
║   ║ 4   ║ 
╚══════════╩═════════════╝ 

回答

4
SELECT t1.animal, GROUP_CONCAT(COALESCE(t2.name, "") separator ',') AS grouped_name 
FROM animals t1 
LEFT JOIN names t2 
    ON t1.id = t2.id2 
GROUP BY t1.animal 

看一看小提琴看到时的行为动物不匹配names表中的任何人。为了处理这种情况,我在名称上使用COALESCE()以在组连接之前用空字符串替换NULL值。

SQLFiddle

+0

我想我的PHP页面上测试你的代码,并得到一个空白页:'$ SQL =“SELECT t1.animal,GROUP_CONCAT( COALESCE(t2.name,“”)separator',') FROM animals t1 LEFT JOIN名称t2 ON t1.id = t2.id2 GROUP BY t1.animal';' – Jarla

+0

检查PHP脚本的别名期待。查询在MySQL中运行良好。 –

+0

必须与'separator'有冲突,''我试着写'separator',''或'separator'“,”'''但仍然不能正常工作 – Jarla

1

嗨,你可以使用这些查询

select a.animal,group_concat(n.name) as name from animals as a 
LEFT JOIN name as n ON n.id2 = a.id 
group by a.animal