2016-03-07 49 views
0

我有一个关于MySql语句的问题。我有2张桌子,录制和训练。训练表包含所有课程的列表,记录表包含用户参加的课程列表。培训表如下加入查询获取不匹配的记录

enter image description here

记录表格式:

enter image description here

我想每个用户的名单不参加培训班。例如:从上述表格结构中,用户277参加130,167,128 & 2.因此,用户277的非参加课程是3,4,5,7,8,9,147,11,12。

我如何编写sql语句获取上述结果?请帮助

+0

这是从训练表中的记录表的外键? –

+0

trainingId是外键 – RAWhoLovesMusic

回答

0

它是这样的

SELECT * FROM training t WHERE t.id NOT IN (select trainingId from record where UserId=277 && piId=1) && t.status=1 ORDER BY t.categoryId 
+0

你给出的答案有什么问题。我的和@FaizHalde的都会给你你所要求的结果(我为所有用户提供的结果,如果你只需要一个用户,其他答案只针对一个用户,那么可以很容易地用WHERE子句修改) 。 – Kickstart

+0

是的,我对你们的答案做了一些改变,这就是为什么我把它发布在这里。但我不是那个投票给你答案的人。 – RAWhoLovesMusic

-1
select id from training where id not in (select trainingid from record where userid = yourid) 
-1

获取用户列表,与培训课程交叉连接,然后将LEFT OUTER JOIN交叉连接到用户完成的培训课程表。我们使用WHERE子句来检查是否与最后一个表格匹配。

未经检验的,但这样的事情: -

SELECT sub_user.UserId, t.id 
FROM 
(
    SELECT DISTINCT UserId from record 
) sub_user 
CROSS JOIN Training t 
LEFT OUTER JOIN Record r 
ON sub_user.UserId = r.UserId 
AND r.trainingId = t.id 
WHERE r.id IS NULL 

如果您的用户(这你可能这样做)的一个表,那么你可以消除子查询并表替换它。