2015-11-09 3 views
0

Итак, я пытаюсь выполнить свой первый подзапрос и столкнулся с небольшой проблемой ... Почему запрос не учитывает мое предложение WHERE?MySQL: проблемы с подзапросом

Мой запрос:

SELECT * 
FROM Product 
WHERE stdUnitPrice < 5* 
(SELECT MIN(stdUnitPrice) 
FROM Product 
WHERE discontinued = 'A') 

Но в результатах я все еще получаю значения в прекращенной столбце, которые не только «А»

Вот результаты:

# productId, prodName, stdUnitPrice, qtyPerUnit, discontinued 
3, Aniseed Syrup, 11.00, 12 - 550 ml bottles, A 
13, Konbu, 6.60, 2 kg box, A 
19, Teatime Chocolate Biscuits, 10.12, 10 boxes x 12 pieces, A 
21, Sir Rodney's Scones, 11.00, 24 pkgs. x 4 pieces, A 
23, Tunnbrod, 9.90, 12 - 250 g pkgs., A 
**24, Guarana Fantastica, 4.95, 12 - 355 ml cans, D** 
33, Geitost, 2.75, 500 g, A 
41, Jack's New England Clam Chowder, 10.61, 12 - 12 oz cans, A 
45, Rogede sild, 10.45, 1k pkg., A 
46, Spegesild, 13.20, 4 - 450 g glasses, A 
47, Zaanse koeken, 10.45, 10 - 4 oz boxes, A 
52, Filo Mix, 7.70, 16 - 2 kg boxes, A 
54, Tourtiere, 8.19, 16 pies, A 
74, Longlife Tofu, 11.00, 5 kg pkg., A 
75, Rhonbrau Klosterbier, 8.52, 24 - 0.5 l bottles, A 
78, Bob's Down Home Juice, 7.90, 6 pack, A 
+1

«дайте мне все продукты, цена которых меньше пяти раз дешевле» «Статья» не «дает мне» «Статьи, цена которых меньше пяти раз дешевой статьи». – Amadan

ответ

2

Попробуйте следующее:

select * 
from Product 
where stdUnitPrice < (5 * (select min(stdUnitPrice) from Product)) 
and discontinued = 'A' 
1

Кажется, что MySQL смотрит на то, где и что думает stdUnitPrice < 5

Также, где вы должны находиться в главном запросе.

Попробуйте переместить математику в подзапрос так:

SELECT * 
FROM Product 
WHERE stdUnitPrice < 
(SELECT 5*MIN(stdUnitPrice) 
FROM Product) 
    AND discontinued = 'A' 
0

Вы выполняете агрегатную операцию подмножества, что фильтруется, однако, ваш основной запрос возвращает все строки. Вы в основном просите вернуть все строки * минимальное значение в таблице. Вам нужно вернуть минимальное значение во все строки, соответствующие вашему предложению.

1

Так что аргументация для этого не работает так, как вы хотите, потому что вам не хватает предложения where в вашем первом запросе. Позвольте мне немного разобраться с вами.

select * from Product where stdUnitPrice < 5* (select min(stdUnitPrice) from Product where discontinued = 'A') 

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

var subquery = select min(stdUnitPrice) from Product where discontinued = 'A'; 

Теперь после того, что подзапрос выполняется он затем подключен обратно в Исходный запрос следующим образом: (с использованием нового имени переменной)

select * from Product where stdUnitPrice < 5 * (subquery); 

так, чтобы это включить где прекращали = «A» вы должны изменить свой запрос на следующее:

SELECT * FROM Product WHERE stdUnitPrice < 5 * (SELECT MIN(stdUnitPrice) FROM Product WHERE discontinued = 'A') AND discontinued = 'A'; 

Надеюсь, это поможет.

EDIT: просто для того, чтобы уточнить, вы не можете использовать переменную типа im, просто используя это в качестве примера, чтобы показать, как запрос будет фактически выполнен.