GROUP_CONCAT很奇怪

时间:2018-07-26 08:23:34

标签: php sql join mysqli group-concat

我使用了三个表,它们在'user.ID'='email.ID'和'user.ID'='telephone.ID'上具有内部联接。

每个用户都有一个名称和一个ID。每封电子邮件都有一个用户名,电子邮件地址本身和一个相应的用户ID。每个电话号码都有一个用户名,号码本身和一个相应的用户ID。用户可以拥有任意数量的电子邮件地址和电话号码。

我设法通过选择用户来输出用户的电子邮件地址:

GROUP_CONCAT(email.Address SEPARATOR ',') AS Address,
GROUP_CONCAT(email.Username SEPARATOR ',') AS eUsername

然后我将其转换为数组:

$Address = explode(",", $row["Address"]);
$eUsername = explode(",", $row["eUsername"]);

并像这样打印它:

  for($i = 0;$i<count($Address);$i++) {
    echo $eUsername[$i] .': '. $Address[$i].'<br>';
  }

这是印刷表: enter image description here

然后我只是用电话号码做同样的事情

选择:

GROUP_CONCAT(telephone.Number SEPARATOR ',') AS Number,
GROUP_CONCAT(telephone.Username SEPARATOR ',') AS tUsername

转化:

$Number = explode(",", $row["Number"]);
$tUsername = explode(",", $row["tUsername"]);

打印:

for($i = 0;$i<count($Number);$i++) {
    echo $tUsername[$i] .': '. $Number[$i].'<br>';
  }

但是这弄乱了整个表: enter image description here

尽管第二个for循环回显到最右边的列中,但我不明白为什么它会重复打印电子邮件地址三遍并且在“电话”列中什么也不打印。

很抱歉,冗长的帖子,感谢您的帮助。

编辑:

这是我完整的SQL查询:

SELECT user.Name AS Name, user.ID AS ID,
GROUP_CONCAT(email.Address SEPARATOR ',') AS Address,
GROUP_CONCAT(email.Username SEPARATOR ',') AS eUsername,
GROUP_CONCAT(telephone.Number SEPARATOR ',') AS Number,
GROUP_CONCAT(telephone.Username SEPARATOR ',') AS tUsername
FROM user
INNER JOIN email ON user.ID=email.ID
INNER JOIN telephone ON user.ID=telephone.ID
WHERE Name REGEXP '$searchterm'
GROUP BY ID

WHERE语句不是最终的。这只是用于测试。

1 个答案:

答案 0 :(得分:0)

最简单的解决方案是使用distinct

SELECT u.Name AS Name, u.ID AS ID,
       GROUP_CONCAT(DISTINCT e.Address SEPARATOR ',') AS Address,
       GROUP_CONCAT(DISTINCT e.Username SEPARATOR ',') AS eUsername,
       GROUP_CONCAT(DISTINCT t.Number SEPARATOR ',') AS Number,
       GROUP_CONCAT(DISTINCT t.Username SEPARATOR ',') AS tUsername
FROM mitglied u INNER JOIN
     email e
     ON u.ID = e.ID INNER JOIN
     telephone t
     ON u.ID = t.ID
WHERE u.Name REGEXP '$searchterm'
GROUP BY u.ID, u.name;

注意:

  • 我假设mitgliedusers
  • 表别名使查询更易于编写和阅读。
  • 只要您有多个表引用,建议使用合格的列名。