GROUP_CONCAT 很奇怪
GROUP_CONCAT being weird
我在 'user.ID'='email.ID' 和 'user.ID'='telephone.ID'.
上使用三个带有内部联接的 table
每个用户都有一个名字和一个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>';
}
这是打印出来的 table:
然后我对电话号码做了同样的事情
正在选择:
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>';
}
但这把整个事情搞砸了 table:
我不明白为什么它打印了三次电子邮件地址并且在 'Telephone' 列中没有打印任何内容,尽管第二个 for 循环被回显到最右边的列中。
抱歉这么久 post,感谢您的帮助。
编辑:
这是我的完整 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 语句不是最终的。这只是为了测试。
最简单的解决方案是使用 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
。
- Table 别名使查询更易于编写和阅读。
- 当您有多个 table 引用时,建议使用限定的列名。
我在 'user.ID'='email.ID' 和 'user.ID'='telephone.ID'.
上使用三个带有内部联接的 table每个用户都有一个名字和一个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>';
}
这是打印出来的 table:
然后我对电话号码做了同样的事情
正在选择:
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>';
}
但这把整个事情搞砸了 table:
我不明白为什么它打印了三次电子邮件地址并且在 'Telephone' 列中没有打印任何内容,尽管第二个 for 循环被回显到最右边的列中。
抱歉这么久 post,感谢您的帮助。
编辑:
这是我的完整 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 语句不是最终的。这只是为了测试。
最简单的解决方案是使用 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
。 - Table 别名使查询更易于编写和阅读。
- 当您有多个 table 引用时,建议使用限定的列名。