我是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)...
答案 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
)