使用带有子查询的IN运算符

时间:2018-02-11 17:00:22

标签: mysql sql

有以下方案

CREATE TABLE request (
  `id` int,
  `classroom` varchar(255),
  `school` varchar(255),
  `date_of_application` datetime,
  `status` varchar(100),
  `user_id` bigint(20) NOT NULL
);

CREATE TABLE user (
  `id` int,
  `full_name` varchar(255)
);

CREATE TABLE user_schools (
  `user_id` int,
  `schools_string` varchar(255) 
);

我需要获取状态字段等于“等待”的请求列表。学校领域位于与用户相关的学校名单中

现在我正在尝试以下查询

SELECT
  r.id,
  u.full_name,
  r.date_of_application,
  r.classroom
FROM
  request r
    inner join
  user u on u.id = r.user_id
WHERE
  r.school IN (
    SELECT
      us.schools_string
    FROM
      user_schools us
    WHERE
      us.user_id = u.id
  )
    AND  r.status = 'pending';

我目前获得了总请求列表。我明白失败的是子查询。

附上sqlfiddle以促进您的协作

我期望的结果是申请人的三个应用程序:用户用户,用户用户和另一个助理用户 谢谢你的想法。如果有更好的解决方案,我感谢你。

此致

1 个答案:

答案 0 :(得分:1)

代码正在按照你的要求行事。如果您需要列表中的用户/请求,则可以使用select distinct,如下所示:

SELECT DISTINCT u.full_name, r.date_of_application
FROM request r inner join
     user u
     on u.id = r.user_id
WHERE r.school IN (SELECT us.schools_string
                   FROM user_schools us
                   WHERE us.user_id = u.id 
                  ) AND
      r.status = 'pending';

但如果您想要教室和请求ID,那么您将获得原始结果集(或某些变体)。

相关问题