PHP SQL,一次从3个表中选择相应的数据?

PHP SQL,一次从3个表中选择相应的数据?,php,sql,Php,Sql,我有三张桌子,“u”和“d” “u”有 用户ID 迪维德 “d”有 divid divname “s”有 sname primaryuserid 第二用户ID 现在我要做的是显示一个表,其中包含以下格式的行 userid、divname、sname 另外,还要找出一种方法来破译userid是这个sname表的主要还是次要 我可以使用左连接显示userid和divname,但我不知道如何添加第三个表?为了使其更为复杂,每个用户ID可以有1个以上的SNAME,最多20个。是否有办法根

我有三张桌子,“u”和“d”

“u”有

  • 用户ID
  • 迪维德
“d”有

  • divid
  • divname
“s”有

  • sname
  • primaryuserid
  • 第二用户ID
现在我要做的是显示一个表,其中包含以下格式的行

  • userid、divname、sname
另外,还要找出一种方法来破译userid是这个sname表的主要还是次要

我可以使用左连接显示userid和divname,但我不知道如何添加第三个表?为了使其更为复杂,每个用户ID可以有1个以上的SNAME,最多20个。是否有办法根据用户ID显示0-20个SNAME,并用逗号分隔

我现在拥有的只是和u和d表,它们彼此对应

SELECT
    e.userid,
    e.divid, 
    d.divname 
FROM 
    e
LEFT JOIN d ON (e.divid = d.id)
ORDER BY e.userid

对于两种可能的关系,您可以联接表和
s
两次:

select 
    u.userid
,   d.divname
,   coalesce(s1.sname, s2.sname)
,   case when s1.sname is not null then 'Primary'
         when s2.sname is not null then 'Secondary'
         else 'None' end
from u
join d on d.divid = u.divid
left join s s1 on s1.primaryuserid = u.userid
left join s s2 on s2.secondaryuserid = u.userid
在PHP中,最好在客户端显示最多20个由逗号分隔的用户名。可以在数据库中执行此操作,但方法取决于您的DBMS。对于MySQL,将子查询限制为20行是很困难的,但是创建逗号分隔的列表很容易。例如:

select
    group_concat(coalesce(s1.sname,s2.sname) separator ',')
,   ...
from u
...
group by u.userid

你在这里寻找一些不同的东西。首先,“根据用户ID显示0-20个SNAME的方式,用逗号分隔”可以通过MySQL的函数完成,因此您的查询看起来是这样的(主要和次要之间没有区别):

现在,为了能够区分用户是主要用户还是次要用户,您必须有一点想象力。我可能会与工会合作,比如:

SELECT u.userid,
    d.divname,
    GROUP_CONCAT(s.sname SEPARATOR ', ') AS "snames",
    'Primary' AS "category"
FROM u
    LEFT JOIN d ON d.divid = u.divid
    LEFT JOIN s ON s.primaryuserid = u.userid
UNION ALL
SELECT u.userid,
    d.divname,
    GROUP_CONCAT(s.sname SEPARATOR ', ') AS "snames",
    'Secondary' AS "category"
FROM u
    LEFT JOIN d ON d.divid = u.divid
    LEFT JOIN s ON s.secondaryuserid = u.userid

这将为每个用户标识提供两行(一个主用户标识,一个辅助用户标识),其中包含以逗号分隔的SNAME列表。

创建一个内部联接并将其放在视图中。然后我们可以在视图上进行选择。

再解释一下表之间的关系会有所帮助。例如,你能给我们你已经在使用的左连接吗?按e.userid(e.divid=d.divid)顺序从e left join d中选择e.userid,d.divname。对不起,缺少编辑,我无法在注释框中格式化。我在第4行的isnull调用中遇到了问题。MySQL给了我错误,并在网上查找,这让它看起来只能接受1个参数。我想我可能没有足够清楚地表达我关于“s”和sname的问题。sname永远不会为空,但是,它可能没有任何附加的用户ID。它最多可以有2个主用户标识和辅助用户标识。@user346325:RIght,
isnull
对于MySQL应该是
coalesce
。它检查null,因为如果
s1
的左连接没有找到任何内容,它会将所有
s1
字段设置为null。我还没有尝试组连接,但它似乎足够简单。感谢联合方法。与我试图做的相比,它大大简化了代码!
SELECT u.userid,
    d.divname,
    GROUP_CONCAT(s.sname SEPARATOR ', ') AS "snames",
    'Primary' AS "category"
FROM u
    LEFT JOIN d ON d.divid = u.divid
    LEFT JOIN s ON s.primaryuserid = u.userid
UNION ALL
SELECT u.userid,
    d.divname,
    GROUP_CONCAT(s.sname SEPARATOR ', ') AS "snames",
    'Secondary' AS "category"
FROM u
    LEFT JOIN d ON d.divid = u.divid
    LEFT JOIN s ON s.secondaryuserid = u.userid