GROUP_CONCAT 很奇怪

问题描述 投票:0回答:1

我使用三个表,并在“user.ID”=“email.ID”和“user.ID”=“telephone.ID”上进行内部联接。

每个用户都有一个名字和一个ID。每封电子邮件都有一个用户名、电子邮件地址本身和相应的

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

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

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
条款不是最终的。这只是为了测试。

sql join group-concat
1个回答
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;

备注:

  • 我假设
    mitglied
    users
  • 表别名使查询更易于编写和读取。
  • 每当您有多个表引用时,建议使用限定的列名称。
© www.soinside.com 2019 - 2024. All rights reserved.