Проблема оператора SQL с использованием AND / OR

0

Привет, я пытаюсь выполнить этот оператор 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
  • 1
    На самом деле при чтении логики кажется, что ваше OR просто нужно заменить на AND из-за! =
  • 0
    Я бы заменил последнюю часть на AND level NOT IN ('PLATINUM', 'GOLD') .
Теги:

3 ответа

3

Если вы не знакомы с базовой логикой, используйте круглые скобки. Кажется, вы не понимаете приоритет для 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 менее неоднозначно. И, это проще писать.

0

Проблема связана с порядком операций, поэтому И имеет более высокий приоритет, чем OR, поэтому, если вы включите скобки, он исправит порядок для вас. Это будет выглядеть так.

SELECT * 
FROM 'items' 
WHERE 'purchased_by' = 0 
AND 'type' = 'CREDIT' 
AND ('level' != 'PLATINUM' OR 'level' != 'GOLD')
ORDER BY 'id' ASC
  • 0
    Теперь он не возвращает все элементы, однако возвращает элемент, который card_level = 'PLATINUM' purchased_by = 0 и type = 'CREDIT' но card_level = 'PLATINUM'
-2

Вы должны попробовать как AND/OR и

SELECT * 
FROM 'items' 
WHERE 'purchased_by' = 0 
AND 'type' = 'CREDIT' 
AND ('level' != 'PLATINUM' OR 'level' != 'GOLD')
ORDER BY 'id' ASC

Объяснение:

Хорошо, поскольку я добавил скобки для 2-х статей, которые используют ИЛИ, поэтому это означает, что уровень не платиновый или не золотой, а остальные пункты используют AND.

Эта скобка устанавливает приоритет для этого оператора.

  • 0
    Теперь он не возвращает все элементы, однако возвращает элемент, который card_level = 'PLATINUM' purchased_by = 0 и type = 'CREDIT' но card_level = 'PLATINUM'
  • 0
    Итак, вы хотите, чтобы все предметы имели уровень Platinum и GOLD? правильно ?
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню