MySql中的AND NOT问题

时间:2011-05-13 13:02:28

标签: mysql sql

我是SQL新手,我正在开发PHP + MySql应用程序。应用程序使用的数据库有许多表,例如 swverforftver

SWVerID  FileTypeVerID
1111     897897
1111     32352342
2222     897897
2222     32352342
2222     222222222
3333     222222222

和表 filetypeversion

FileTypeVerID      PubID       FileTypeID      IsRelatedTo    IsPreviousVersionOf
897897             789789798   6575            dw             qweq
32352342           68767       231232          dasdasda       asdasda
222222222          333333      231231          asd            wdadw

和表 softwareversion

SWVerID  SWID    Name
1111     1234    Adobe Reader
2222     5678    Word
3333     4444    ExcelVersion

我正在使用SQL命令从与FileTypeVerID 897897 值关联的softwareversion表中检索SWVerID值,并且该值与swverforftver中的 222222222 值无关表

我使用的命令如下:

SELECT  distinct softwareversion.SWVerID 
FROM    softwareversion,
        filetypeversion,
        swverforftver AS stv JOIN 
        swverforftver AS stv2 ON stv2.SWVerID = stv.SWVerID 
WHERE   stv2.FileTypeVerID=filetypeversion.FileTypeVerID 
AND     stv.SWVerID=softwareversion.SWVerID 
AND     (stv2.FileTypeVerID = 897897) 
AND NOT (stv.FileTypeVerID = 222222222)

它不是仅返回1111值,而是与897897相关联的唯一值而不是222222222,而是返回一个包含两个值的表:

SWVerID
1111
2222

有谁知道这个问题?另外,SQL命令不应该在当前结构中修改(它应该基本上有JOIN和AS)...

4 个答案:

答案 0 :(得分:1)

您获得结果集中的第二行,因为SWVerID = 2222存在3行,因此为此计算条件为true。请改用NOT IN:

SELECT  distinct softwareversion.SWVerID 
FROM    softwareversion,
        filetypeversion,
        swverforftver AS stv 
WHERE   stv2.FileTypeVerID=filetypeversion.FileTypeVerID 
AND     stv.SWVerID=softwareversion.SWVerID 
AND     (stv2.FileTypeVerID = 897897) 
AND NOT EXISTS (select null from swverforftver AS stv2 WHERE stv2.SWVerID = stv.SWVerID AND 
stv2.FileTypeVerID = 222222222)

答案 1 :(得分:0)

改为使用not equal运算符:

SELECT  distinct softwareversion.SWVerID 
FROM    softwareversion,filetypeversion,swverforftver AS stv JOIN 
        swverforftver AS stv2 ON stv2.SWVerID = stv.SWVerID 
WHERE   stv2.FileTypeVerID=filetypeversion.FileTypeVerID 
AND     stv.SWVerID=softwareversion.SWVerID 
AND     (stv2.FileTypeVerID = 897897) 
AND     (stv.FileTypeVerID != 222222222)

答案 2 :(得分:0)

不确定我是否完全明白了你的问题,但你的not()子句可能会消除错误的行。

要调试sql语句,请列出所有列:

select *
from ...
join ...
where ...

这将显示数据库在被过滤之前看到的行。它可能会强调您尝试消除SWVerID而不是FileTypeVerID,并且您应该使用反连接:SWVerID not in (subquery)

答案 3 :(得分:0)

您的查询仍将返回2222,因为有些记录符合条件NOT (stv.FileTypeVerID = 222222222)。我会使用NOT IN来消除任何SWVerID

FileTypeVerID = 222222222
SELECT  distinct softwareversion.SWVerID  
FROM softwareversion,filetypeversion,swverforftver AS stv 
WHERE stv2.FileTypeVerID=filetypeversion.FileTypeVerID  
AND stv.SWVerID=softwareversion.SWVerID 
AND stv.FileTypeVerID = 897897
AND stv.SWVerID NOT IN (
    SELECT DISTINCT SWVerID FROM swverforftver
    WHERE FileTypeVerID = 222222222
)