Проблема с И НЕ в MySql - PullRequest
       2

Проблема с И НЕ в MySql

3 голосов
/ 13 мая 2011

Я новичок в 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 для извлечения значений SWVerID из таблицы версии программного обеспечения, связанной со значением FileTypeVerID 897897 И КОТОРОЕ НЕ связано со значением 222222222 из таблицы swverforftver.

Я использую следующую команду:

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 ]

1 голос
/ 13 мая 2011

Вы получаете вторую строку в вашем наборе результатов, потому что существует 3 строки для SWVerID = 2222, поэтому для этого условия оценивается как 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)
0 голосов
/ 13 мая 2011

Ваш запрос по-прежнему будет возвращать 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
)
0 голосов
/ 13 мая 2011

Не уверен, что я полностью понимаю ваш вопрос, но ваше предложение not (), скорее всего, устраняет неправильные строки.

Чтобы отладить оператор SQL, перечислите все столбцы:

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

Это покажет строки, как они видны в базе данных, прежде чем они будут отфильтрованы.Вероятно, будет подчеркнуто, что вы пытаетесь исключить SWVerID, а не FileTypeVerID, и вместо этого вам следует использовать анти-объединение: SWVerID not in (subquery)

0 голосов
/ 13 мая 2011

Вместо этого используйте оператор неравенства:

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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...