我有以下问题:
SELECT * FROM students
WHERE gwid NOT IN (
SELECT gwid FROM attendance
WHERE((date='160126') AND (classid = 'm1100'))
)
查询运行时没有错误,但仍显示classid不是m1100的行。请看下面的相同结果:
答案 0 :(得分:0)
你说你想获得classid m1100所以你应该删除not关键字。此外,不需要子查询的where子句中的括号,但我不知道它是否会改变任何内容。另外,我认为您需要在外部查询中过滤classid,以避免让学生在子查询结果中使用guid,而不是在classId m1100中。
试试这个:
SELECT
*
FROM
students
WHERE
gwid
IN
(SELECT
gwid
FROM
attendance
WHERE
date='160126'
AND
classid = 'm1100')
AND
classId = 'm1100'
答案 1 :(得分:0)
试试这个
$html->find('.msgsource');
嗯......首先你是在classid = m1100之后,但是你想要gwids不参加那个特定的类id ...所以你的子查询应该限于主查询classid的classid
答案 2 :(得分:0)
您的AND工作正常,但是您要求查看仅在该特定日期没有参加该课程的学生。如果您想过滤掉所有没有参加该课程的学生,您应该在子选择中省略您的日期条款。
答案 3 :(得分:0)
您是否尝试对查询应用简单的英语口译,并且您是否正寻求在该日期找到那些不在出席该课程的学生?
要做到这一点,你需要知道当天哪些学生应该上课,所以你需要某种注册信息。这可能是在黑暗中的总刺。请注意,我假设gwid
是学生标识符,并且您有一些注册/注册来源,可以在学生和出勤之间进行。
SELECT *
FROM students
WHERE gwid in
(
SELECT gwid
FROM enrollment
WHERE classid = 'm1100' and gwid NOT IN
(
SELECT gwid
FROM attendance
WHERE date = '160126' AND classid = 'm1100'
)
)
由于各种原因,您可能更喜欢或需要避免重复classid
参数:
/* Modified to avoid repeating the classid */
SELECT *
FROM students
WHERE gwid IN
(
SELECT gwid
FROM enrollment e
WHERE classid = 'm1100' and gwid NOT IN
(
SELECT gwid
FROM attendance a
WHERE a.classid = e.classid AND date = '160126'
)
)
有些人反对级联in
子查询。学习如何编写SQL连接肯定是一个很好的理由:
/* Modified to use an inner join */
SELECT *
FROM students s inner join enrollment e on e.gwid = s.gwid
WHERE e.classid = 'm1100' and e.gwid NOT IN (
SELECT gwid
FROM attendance a
WHERE a.classid = e.classid AND date = '160126'
)
虽然连接条件更复杂,但我可能只是坚持使用之前的一个查询,也可以消除not in
。我认为这种结构现在比开发人员更熟悉了。
/* Modified to use a left join */
SELECT *
FROM
students s
inner join enrollment e
on e.gwid = s.gwid
left outer join attendance a
on a.classid = e.classid and a.gwid = e.gwid and a.date = '160126'
WHERE
e.classid = 'm1100' and a.gwid is null