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

时间:2010-05-20 17:06:00

标签: php sql

我有3张桌子,'你'是'

'你'有

  • 用户ID
  • DIVID

'd'有

  • DIVID
  • divname

''有

  • SNAME
  • primaryuserid
  • secondaryuserid

现在我要做的是显示一个包含以下格式的行的表

  • userid,divname,sname

另外找出一种解密用户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

3 个答案:

答案 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)

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