我有3张桌子,'你'是'
'你'有
'd'有
''有
现在我要做的是显示一个包含以下格式的行的表
另外找出一种解密用户ID是否是此sname表的主要或辅助的方法。
我可以使用左连接显示userid和divname,但我不知道如何添加第三个表?为了使它变得更加棘手,每个用户ID可以有多于1个,最多约20个。有没有办法显示0-20个snames,具体取决于用户ID,用逗号分隔?
我目前所拥有的只是和你和彼此对应的表格。
SELECT
e.userid,
e.divid,
d.divname
FROM
e
LEFT JOIN d ON (e.divid = d.id)
ORDER BY e.userid
答案 0 :(得分:2)
你在这里寻找几件不同的东西。首先,可以使用MySQL的GROUP_CONCAT()
函数完成“使用逗号分隔显示0-20 snames取决于用户ID的方法”,因此您的查询看起来像这样(主要和次要之间没有区别) :
SELECT u.userid,
d.divname,
GROUP_CONCAT(s.sname SEPARATOR ', ') AS "snames"
FROM u
LEFT JOIN d ON d.divid = u.divid
LEFT JOIN s ON (s.primaryuserid = u.userid OR s.secondaryuserid = u.userid);
现在,为了能够区分用户是主要用户还是次要用户,你必须得到一点点发烧友。我可能会用工会做这件事:
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
这将为每个userid提供两行(一个Primary,一个Secondary),并以逗号分隔的snames列表。
答案 1 :(得分:1)
您可以加入表格,并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
最多显示20个用逗号分隔的用户名最好在客户端使用PHP完成。可以在数据库中执行此操作,但该方法取决于您的DBMS。对于MySQL,将子查询限制为20行很难,但创建以逗号分隔的列表很容易。例如:
select
group_concat(coalesce(s1.sname,s2.sname) separator ',')
, ...
from u
...
group by u.userid
答案 2 :(得分:0)
创建内部联接并将其放在视图中。然后我们可以在视图上做一个选择。