MySQL'AND'无效

时间:2016-01-26 21:42:40

标签: mysql sql

我有以下问题:

SELECT * FROM students 
WHERE gwid NOT IN (
    SELECT gwid FROM attendance 
    WHERE((date='160126') AND (classid = 'm1100'))
)

查询运行时没有错误,但仍显示classid不是m1100的行。请看下面的相同结果:

4 个答案:

答案 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