2014-11-23 2 views
1

У меня возникли проблемы с получением синтаксиса для инструкции SELECT MySQL с подзапросом в инструкции IF.Синтаксис для оператора SELECT MySQL с подзапросом в инструкции IF


EDIT

мне нужно включить подзапросов в запросе дб, если были указаны конкретные значения. В этом конкретном примере, если они указали элемент, то только выборка строк, где Item и Price также соответствуют определенным значениям.

SELECT * FROM Products WHERE Products.Color = :Colors_like 
AND IF(Item = IS NOT NULL OR Item != '' 
(Item = :Item AND Products.Price <= (SELECT $MaxPrice_Item FROM Lifestyle WHERE User_id = $User_id)) 
) 

Я включил упрощенный фрагмент ниже с закодированными значениями


Это работает правильно:

SELECT * FROM Products WHERE Color = 'Black' 
AND IF (Item = 'Dresses', 1, 0) = 1 

Это не работает (если деталь = платья, он должен проверить цену)

SELECT * FROM Products WHERE Color = 'Black' 
AND IF (Item = 'Dresses' (SELECT * FROM Products WHERE Price < '$300'), 1, 0) = 1 

Я пробовал каждый формат, о котором я мог думать, но я не могу заставить это заявление работать.

+0

«Это не работает» --- что он должен делать на самом деле? Запрос полностью сломан, и трудно догадаться, что вы хотели выразить с ним. PS: 'WHERE Price <'$ 300'' действительно ли вы храните цены как префиксные строки' $ 'char? – zerkms

+0

@zerkms - Я только уточнил, что он должен делать :-) (Извинения, если я не был ясен) –

+0

Это еще не ясно. Попробуйте объяснить язык домена. Например: мне нужно выбрать продукты, которые являются черными и ... и ... PS: вы все еще не ответили о ценах PPS: 'IF (Item = 'Dresses', 1, 0) = 1' - это не делает смысл. Таким образом, попытка решить его «подобным образом» ошибочна по дизайну. – zerkms

ответ

1

Вам нужно что-то перед подвыборкой:

SELECT * 
FROM Products 
WHERE Color = 'Black' AND 
    IF (Item = 'Dresses' ?? (SELECT * FROM Products WHERE Price < '$300'), 1, 0) = 1 
--------------------------^ 

Я не совсем уверен, что, потому что есть много других проблем, такие как:

  • Использования * где ожидаются скалярный подзапрос ,
  • Использование '$300' предположительно для сравнения с числом. (Или, что еще хуже, сохранение «цены» в виде строки.)
  • Наличие скалярного подзапроса возвращает несколько строк.

Если вы хотите условную логику, то это то, что я думаю, что вы хотите:

SELECT p.* 
FROM Products p 
WHERE p.Color = 'Black' AND 
     (p.Item <> 'Dresses' OR p.Price < 300) 
+0

@zerkms. , , Я перефразировал эту часть. –

+0

Я не понимаю, что мне нужно добавить перед подмножеством, чтобы заставить оператор IF работать, поэтому я надеюсь, что информация, которую я только что добавил в вопрос, должна помочь прояснить, что я пытаюсь делать –

Смежные вопросы