Inf*_*ity 5 html php mysql sql
为了便于解释,我将尝试简化一切.
我有3个SQL表:Users,Certs,Serv
在Users表中存储有关唯一用户的详细信息.
在Certs表中存储有关证书和UserId具有此证书的用户的详细信息(1个用户可以拥有多个证书)
在Serv表中存储有关海上服务和UserId用户的详细信息(如Certs表,1个用户可以在Serv表中有多个条目)
样本数据
用户
UserId Name
1 John
2 Lisa
Run Code Online (Sandbox Code Playgroud)
证书
Id UserId CertName
1 1 A
2 1 B
3 1 C
4 2 A
5 2 C
Run Code Online (Sandbox Code Playgroud)
SERV
UserId Name
1 SA
1 SB
1 SC
1 SD
2 S2A
Run Code Online (Sandbox Code Playgroud)
我需要通过PHP检索输出(例如UserId = 1)同样对于现实,每个表中会有更多列(例如证书的更多细节,如发布日期,到期日期,发布地点等):
Personal details:
Name
John
Certificates:
Certificate Id Certificate Name
1 A
2 B
3 C
Sea Services:
Sea Service Name
SA
SB
SC
SD
Run Code Online (Sandbox Code Playgroud)
但是我得到了错误的输出,重复的条目,因为加入2个表,UserId其中有多个记录UserId.
PHP代码
$users = $con->prepare("
select u.Name
,GROUP_CONCAT(c.Id SEPARATOR '<br>') AS Id
,GROUP_CONCAT(c.certsName SEPARATOR '<br>') AS certsName
,GROUP_CONCAT(s.Name SEPARATOR '<br>') AS Name
from users u
left join certs c on u.UserId = c.UserId
left join serv s on u.UserId = s.UserId
where u.UserId = ?
");
$users->bind_param('i', $GetUserId);
$users->execute();
$users->bind_result(
$userName,
$certId,
$certName,
$servName
);
<?php
while ($users->fetch()) {
?>
<span>Personal Details</span>
<div class="grid-group">
<div class="grid-column">
<div class="grid-item header">User Name </div>
</div>
<div class="grid-column">
<div class="grid-item"><?php echo $userName; ?></div>
</div>
</div>
<span>Certificates</span>
<div class="grid-group">
<div class="grid-column">
<div class="grid-item header">Certificate Id</div>
<div class="grid-item header">Certificate Name</div>
</div>
<div class="grid-column">
<div class="grid-item"><?php echo $certId; ?></div>
<div class="grid-item"><?php echo $certName; ?></div>
</div>
</div>
<span>Sea Services</span>
<div class="grid-group">
<div class="grid-column">
<div class="grid-item header">Sea Service Name</div>
</div>
<div class="grid-column">
<div class="grid-item"><?php echo $servName; ?></div>
</div>
</div>
<?php } ?>
Run Code Online (Sandbox Code Playgroud)
您可以检查SQL FIDDLE以查看选择的结果,复制行.
您是否有想法如何在不重复的情况下实现所需的输出?
UPDATE
使用GROUP_CONCAT后DISTINCT它还是错的.想象一下,在Serv表中我有喜欢的列:UserId,Name,Rank和Country
如果同一个用户在不同的公司工作(这个名称在示例中 - 公司名称),在不同的国家/地区具有相同的级别,则选择错误的数据.例如:
Serv表(SQL)
UserId Name Rank Country
1 SA Captain USA
1 SB Captain USA
1 SC Captain RUS
1 SD Captain ENG
2 S2A Engineer USA
Run Code Online (Sandbox Code Playgroud)
如果我使用这样的查询:
select u.Name
,GROUP_CONCAT(distinct c.Id SEPARATOR '<br>') AS Id
,GROUP_CONCAT(distinct c.certsName SEPARATOR '<br>') AS certsName
,GROUP_CONCAT(distinct s.Name SEPARATOR '<br>') AS Name
,GROUP_CONCAT(distinct s.Rank SEPARATOR '<br>') AS Rank
,GROUP_CONCAT(distinct s.Country SEPARATOR '<br>') AS Country
from users u
left join certs c on u.UserId = c.UserId
left join serv s on u.UserId = s.UserId
where u.UserId = ?
Run Code Online (Sandbox Code Playgroud)
所以GROUP_CONCAT(DISTINCT..)让我回答:
......
Sea Services:
Sea Service Name Rank Country
SA Captain USA
SB RUS
SC ENG
SD
Run Code Online (Sandbox Code Playgroud)
只有第一行有排名,前三行有国家/地区返回,但在数据库中存储了每行的排名和国家/地区.
使用此数据的完整所需输出应如下所示:
Personal details:
Name
John
Certificates:
Certificate Id Certificate Name
1 A
2 B
3 C
Sea Services:
Sea Service Name Rank Country
SA Captain USA
SB Captain USA
SC Captain RUS
SD Captain ENG
Run Code Online (Sandbox Code Playgroud)
你可以在SQL FIDDLE上查看它
更新2
如果我删除DISTINCT我得到以下输出:
Sea Service Name Rank Country
SA Captain USA
SA Captain USA
SA Captain USA
SB Captain USA
SB Captain USA
SB Captain USA
SC Captain RUS
SC Captain RUS
SC Captain RUS
SD Captain ENG
SD Captain ENG
SD Captain ENG
Run Code Online (Sandbox Code Playgroud)
如果我正在使用DISTINCT我得到这样的:
Sea Services:
Sea Service Name Rank Country
SA Captain USA
SB RUS
SC ENG
SD
Run Code Online (Sandbox Code Playgroud)
但它应该是:
Sea Services:
Sea Service Name Rank Country
SA Captain USA
SB Captain USA
SC Captain RUS
SD Captain ENG
Run Code Online (Sandbox Code Playgroud)
更新3
想象一下,我有固定的列宽,我有很长的海服务名称,它将被包装到新行:
Sea Service Name | Rank | Country
-----------------|--------|---------
This is long Sea | Captain| USA
Service Name |--------|---------
-----------------| Captain| RUS
Other Name |--------|---------
-----------------| Captain| ENG
Another long Sea |--------|---------
Service Name | Master | USA
-----------------|--------|---------
Other Sea Serv |
-----------------|
Run Code Online (Sandbox Code Playgroud)
如您所见,每列都是独立的,行不匹配.但它应该像1排.所以我觉得我无法实现它GROUP_CONCAT,看起来我需要另一种方式.
它看起来如何:
你错过了一个group by条款:
select u.Name
,GROUP_CONCAT(distinct c.Id SEPARATOR '<br>') AS Id
,GROUP_CONCAT(distinct c.certsName SEPARATOR '<br>') AS certsName
,GROUP_CONCAT(distinct s.Name SEPARATOR '<br>') AS Name
,(SELECT GROUP_CONCAT(ss.Rank SEPARATOR '<br>') FROM users uu
LEFT OUTER JOIN serv ss ON (uu.UserId = ss.UserId)
WHERE uu.user_id = u.user_id) as Rank
,GROUP_CONCAT(distinct s.Country SEPARATOR '<br>') AS Country
from users u
left join certs c on u.UserId = c.UserId
left join serv s on u.UserId = s.UserId
where u.UserId = ?
Run Code Online (Sandbox Code Playgroud)
此外,我已经添加了与您不同的内容,GROUP_CONCAT因为您要为每个用户连接多个行的多个表,您将有多个重复项.
| 归档时间: |
|
| 查看次数: |
1132 次 |
| 最近记录: |