php – 从1个用户的MySQL表中选择多行

前端之家收集整理的这篇文章主要介绍了php – 从1个用户的MySQL表中选择多行前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

为了便于解释,我将尝试简化一切.

我有3个sql表:Users,Certs,Serv

在Users表中存储有关唯一用户的详细信息.

在Certs表中存储有关证书的详细信息和拥有此证书的用户的UserId(1个用户可以拥有多个证书)

在Serv表中存储有关海上服务和用户的UserId的详细信息(如Certs表,1个用户可以在Serv表中有多个条目)

样本数据

用户

UserId  Name
1       John
2       Lisa

证书

Id  UserId  CertName
1   1       A
2   1       B
3   1       C
4   2       A
5   2       C

SERV

UserId  Name
1       SA
1       SB
1       SC
1       SD
2       S2A

我需要通过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

但是我得到错误输出,重复的条目,因为用UserId连接2个表,其中UserId是多个记录的UserId.

PHP代码

$users = $con->prepare("
    select u.Name,GROUP_CONCAT(c.Id SEPARATOR 'PHP 
while ($users->fetch()) {
?>

PHP echo $userName; ?>PHP echo $certId; ?>PHP echo $certName; ?>PHP echo $servName; ?>PHP } ?>

您可以检查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 

如果我使用这样的查询

select u.Name,GROUP_CONCAT(distinct c.Id SEPARATOR '

所以GROUP_CONCAT(DISTINCT ..)让我回答如下:

......
Sea Services:
Sea Service Name    Rank      Country
SA                  Captain   USA
SB                            RUS
SC                            ENG
SD                        

只有第一行有排名,前三行有国家/地区返回,但在数据库中存储了每行的排名和国家/地区.

使用此数据的完整所需输出应如下所示:

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

你可以在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

如果我正在使用DISTINCT,我会这样:

Sea Services:
Sea Service Name    Rank      Country
SA                  Captain   USA
SB                            RUS
SC                            ENG
SD                        

但它应该是:

Sea Services:
Sea Service Name    Rank      Country
SA                  Captain   USA
SB                  Captain   USA             
SC                  Captain   RUS
SD                  Captain   ENG

更新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   |
-----------------|

如您所见,每列都是独立的,行不匹配.但它应该像1排.所以我觉得我用GROUP_CONCAT无法实现它,看起来我需要另一种方式.

它看起来如何:

rows not match

最佳答案
您缺少group by子句:

select u.Name,(SELECT GROUP_CONCAT(ss.Rank SEPARATOR '

此外,我已经为您的GROUP_CONCAT添加了不同之处,因为您要为每个用户连接多个行的多个表,您将有多个重复项.

原文链接:https://www.f2er.com/html/426589.html

猜你在找的HTML相关文章