Mysql为每个返回的结果选择IN另一个表行

时间:2018-02-28 11:34:40

标签: mysql sql database

我有两张表sectionusers。我需要运行一个简单的查询来返回所有部分。但是,对于每个部分,在用户部分中具有多个ID的字段中可能存在对应的id。即ids = 2,6,8,10

以下是按ID及其分配的用户选择特定部分的示例。

Select * from section, users where sectionid = '2' and sectionid IN (`ids`);

这会返回user.ids 2所在的ids所有section ------------------------------------ sectionid, sectionname, Description 2 section2 4 section4 6 section6 8 section8 User ------------------------------------ userid, ids(of the section/s), 1 4,6 2 4,8 3 4 4,6,8

我的问题是我需要选择分配给一个表中每个部分的所有用户吗?

Result
-------------------
Sectionid,  sectionname,   usersassignedtothissection
    2         section2              null (no one assigned to section2)
    4         section4              1,2,4
    6         section6              1
    8         section8              2,4

所需结果:显示所有部分是否分配用户,并在一列中显示每个部分的用户ID / s分配,如下所示。

ajax post

1 个答案:

答案 0 :(得分:3)

您可以使用FIND_IN_SETJOIN表格使用以下解决方案:

SELECT 
    section.sectionid, 
    section.sectionname, 
    GROUP_CONCAT(user.userid ORDER BY user.userid) AS 'usersassignedtothissection'
FROM section 
    LEFT JOIN user ON FIND_IN_SET(section.sectionid, user.ids)
GROUP BY section.sectionid, section.sectionname
  

演示: http://sqlfiddle.com/#!9/f9b860/5/0

注意:建议不要使用列来存储多个值!您可以创建映射表以将表section映射到表user,如下所示:

CREATE TABLE section_user (
    user_id INT,
    section_id INT
)

在这种情况下,您的查询将如下:

SELECT 
    s.sectionid, 
    s.sectionname, 
    GROUP_CONCAT(u.userid ORDER BY u.userid) AS 'usersassignedtothissection'
FROM section s 
    LEFT JOIN section_user su ON s.sectionid = su.section_id 
    LEFT JOIN user u ON su.user_id = u.userid
GROUP BY s.sectionid, s.sectionname
  

演示: http://sqlfiddle.com/#!9/432059/2/0