繁体   English   中英

MySQL筛选多对多

[英]MySQL Filter Many-to-Many

我有以下表格:

CREATE TABLE `job_requirements` (
  `job_id` INT(10) UNSIGNED NOT NULL,
  `course_id` INT(10) UNSIGNED NOT NULL,
  PRIMARY KEY (`job_id`,`course_id`)
)

CREATE TABLE `courses_completed` (
  `courseId` INT(10) UNSIGNED NOT NULL,
  `userId` INT(10) UNSIGNED NOT NULL,
  `completionDate` BIGINT(20) UNSIGNED NOT NULL,
  `completionStatus` INT(10) UNSIGNED NOT NULL,
  PRIMARY KEY (`courseId`,`userId`,`completionDate`)
)

用户可以使用各种completeStatuss多次完成课程。 一项工作可能有多个要求。 我如何获得已完成(completionStatus = 1)所有工作必修课程的所有用户的列表?

我想出的最好的方法是返回一个用户已完成的必修,未过期课程的查询:

SELECT COUNT(*) FROM 
    (
        SELECT courseId FROM courses_completed
        INNER JOIN courses ON courseId = courses.id
        WHERE completionStatus = 1
        AND courseId IN (
            SELECT course_id FROM job_requirements
            WHERE job_id = 1)
        AND userId = 23
        AND (FROM_UNIXTIME(completionDate)
             + INTERVAL expiration_days DAY
             + INTERVAL expiration_months MONTH
             + INTERVAL expiration_years YEAR) > NOW()
        GROUP BY courseId
    ) AS sub;

以及一个查询,该查询返回已完成任何必修课程的用户列表:

SELECT userId
FROM courses_completed WHERE courseID 
IN 
(
    SELECT course_id 
    FROM job_requirements
    WHERE job_id = 1
) GROUP BY userId;

我不知道如何将两者结合起来,因此第二个查询中每行的userId会传递到第一个查询中

使用JOIN

SELECT userId
FROM (
    SELECT userId, COUNT(*) AS courses_completed
    FROM courses_completed AS cc
    JOIN job_requirements AS jr ON cc.courseID = jr.courseID
    WHERE jr.job_id = 1
    AND cc.completionStatus = 1
    AND (FROM_UNIXTIME(completionDate)
         + INTERVAL expiration_days DAY
         + INTERVAL expiration_months MONTH
         + INTERVAL expiration_years YEAR) > NOW()
    GROUP BY userId) AS u
JOIN (
    SELECT COUNT(*) AS courses_required
    FROM job_requirements
    WHERE job_id = 1) AS j
ON u.courses_completed = j.courses_required

您也可以在没有JOIN情况下执行此操作,但是此结构允许您将其扩展到多个作业。 从两个WHERE clauses, and add it to the取出job_id = 1 WHERE clauses, and add it to the SELECT and GROUP BY clauses, as well as the final ON`子句中。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM