Привет, я пытаюсь выполнить этот оператор SQL в phpMyAdmin, однако, когда я выполняю приведенный ниже оператор, он возвращает все элементы независимо от того, отличается ли type
от CREDIT, а не от этого, например,
An item with CREDIT which level is REGULAR (therefore != PLATINUM or GOLD)
SELECT *
FROM 'items'
WHERE 'purchased_by' = 0
AND 'type' = 'CREDIT'
AND 'level' != 'PLATINUM'
OR 'level' != 'GOLD'
ORDER BY 'id' ASC
Если вы не знакомы с базовой логикой, используйте круглые скобки. Кажется, вы не понимаете приоритет для AND
и OR
.
В вашем случае, однако, вы можете исправить проблему, используя NOT IN
:
SELECT i.*
FROM items i
WHERE purchased_by = 0 AND
type = 'CREDIT' AND
level NOT IN ('PLATINUM', 'GOLD')
ORDER BY id ASC;
Обратите внимание, что вы также можете исправить свою логику, изменив OR
на AND
- это на самом деле логика, которую вы действительно хотите. Однако NOT IN
менее неоднозначно. И, это проще писать.
Проблема связана с порядком операций, поэтому И имеет более высокий приоритет, чем OR, поэтому, если вы включите скобки, он исправит порядок для вас. Это будет выглядеть так.
SELECT *
FROM 'items'
WHERE 'purchased_by' = 0
AND 'type' = 'CREDIT'
AND ('level' != 'PLATINUM' OR 'level' != 'GOLD')
ORDER BY 'id' ASC
card_level = 'PLATINUM'
purchased_by = 0
и type = 'CREDIT'
но card_level = 'PLATINUM'
Вы должны попробовать как AND/OR
и
SELECT *
FROM 'items'
WHERE 'purchased_by' = 0
AND 'type' = 'CREDIT'
AND ('level' != 'PLATINUM' OR 'level' != 'GOLD')
ORDER BY 'id' ASC
Объяснение:
Хорошо, поскольку я добавил скобки для 2-х статей, которые используют ИЛИ, поэтому это означает, что уровень не платиновый или не золотой, а остальные пункты используют AND.
Эта скобка устанавливает приоритет для этого оператора.
card_level = 'PLATINUM'
purchased_by = 0
и type = 'CREDIT'
но card_level = 'PLATINUM'
OR
просто нужно заменить наAND
из-за! =AND level NOT IN ('PLATINUM', 'GOLD')
.