我认为这是一个经典的SQL问题,但我无法在互联网上找到任何提示。
我的数据库表是:
Table User:
ID UserName Adress
1 Uwe No 1
2 user2 No 2
3 name3 No 3
Table Tel:
ID telNumber user_id
1 123 1
2 234 1
3 123 2
4 567 1
5 900 3
6 800 3
7 111 1
使用此选项:
SELECT user.UserName, tel.telNumber, user.Adress
FROM [user] INNER JOIN tel ON user.ID = tel.user_id;
我会得到:
UserName Tel Adress
---------------------------
Uwe 123 No 1
Uwe 234 No 1
user2 123 No 2
Uwe 567 No 1
name3 900 No 3
name3 800 No 3
Uwe 111 No 1
----------------------------
我现在正在寻找的是这样的事情:
Name: Uwe
Tel1: 123
Tel2: 234
Tel3: 567
Tel4: 111
Adress: No 1
Name: name3
Tel1: 900
Tel2: 800
Adress: No 3
我怎样才能得到这个结果?我如何调整我的SQL语句,我可以通过PHP找到一种方便的方法来捕获它?
答案 0 :(得分:2)
您可以使用group_concat
和group by
来获取每个用户的电话号码。然后,您可以使用爆炸或其他功能来分割电话号码并迭代它们。例如:
SELECT u.UserName, group_concat(t.telNumber) as numbers, u.Adress
FROM user as u
INNER JOIN tel as t
ON u.ID = t.user_id
group by u.ID
SQL演示:http://sqlfiddle.com/#!9/6dca9b/3
PHP实现类似于:
<?php
$numers = array('User1' => '1', 'User2' => '123,456');
foreach($numers as $user => $num){
echo $user . PHP_EOL;
if(strpos($num, ',') === FALSE) {
echo 'Tel1:' . $num .PHP_EOL;
} else {
$nums = explode(',', $num);
foreach($nums as $key => $temp){
echo 'Tel' . ($key + 1) . ':' . $temp .PHP_EOL;
}
}
}
答案 1 :(得分:1)
根据经验,不要将演示数据与逻辑混合。
您实际上需要 SQL查询以返回公共主题记录列表的序列号。这个细节最好留给应用层,即你的PHP代码。让你的PHP代码&#34;知道&#34;当它列出给定用户的电话号码时(这应该是微不足道的)并以你所示的列举方式呈现它们(伪代码):
for each user:
i = 0
for each 'user' phone number:
i++
show phone number (i)
next
next
知道哪个电话处于哪个位置比知道你为用户准备好它们(通常)不那么重要。