2014-02-14 2 views
1
SELECT Product.name, Product.price 
FROM Purchased, Product 
WHERE Purchased.date1 > '2013-11-02' 
ORDER BY price DESC group by Product.name 

Здравствуйте, я пишу запрос, чтобы вернуть список уникальных продуктов, которые были куплены на сайте продавца с 2-го ноября с самым дорогим продуктом, возвращенным в первую очередь.Возврат уникальных вещей в запросе SQL

Может ли кто-нибудь сказать мне, что не так с моим синтаксисом?

+3

Возможно, вы должны указать в своем запросе, как связаны две таблицы. – marcosh

+0

Каков результат? – wumpz

ответ

1
SELECT 
    p.name AS Name, 
    MAX(p.price) AS Price 
FROM Purchased AS pr 
INNER JOIN Product AS p 
    ON pr.ProductId=p.ProductId 
WHERE pr.date1 > '2013-11-02' 
GROUP BY p.name 
ORDER BY p.price DESC 

Я полагаю, что обе таблицы, приобретенные и продукты, имеют столбец productId. Таким образом, каждая запись в одну таблицу будет связана с другой записью с другой таблицей. Если это не имя этого столбца, пожалуйста, измените ProductId на соответствующее имя.

0

Можете ли вы попробовать это:

SELECT Product.name, Product.price 
FROM Purchased, Product 
WHERE Purchased.date1 > '2013-11-02' 
ORDER BY price DESC GROUP BY Product.name,Prodcut.price 

При использовании GROUP BY, вы должны включать в себя все столбцы, которые вы извлекаете в выберите класс.

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

0

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

SELECT Product.name, Product.price 
FROM Purchased, Product 
where Purchased.productid = product.id 
and Purchased.date1 > '2013-11-02' 
ORDER BY price DESC 

Что мы здесь делаем, это объединение двух таблиц по столбцу id, который у них есть. Делая это, база данных знает, что связывает данные.

Допустим, мы имеем таблицу покупки

PurchaseDate , Productid, 
2013-11-02  1 
2013-11-03  2 

стол Продукт

id , Product name 
1   Fuzzy Bunny 
2   Fuzzy bear 

Теперь, если вы посмотрите на эти данные, вы знаете, что на 2013-11-02 нечеткой кролика был купить. Это можно увидеть, потому что productid в вашей таблице покупок ссылается на идентификатор в таблице продуктов. Вот как вы выяснили, как работать с Joins в SQL.

3

Вы неправильно используете группу MySQL по своему расширению. Хотя MySQL позволяет помещать элементы в список выбора, которые не входят в группу, или агрегат, он не является детерминированным, и ORDER BY не поможет.

MySQL documents состояния:

Сервер может свободно выбрать любое значение из каждой группы, так что, если они не совпадают, значение, выбранное неопределенно. Более того, выбор значений из каждой группы не может зависеть от добавления предложения ORDER BY.

Таким образом, даже если данные были как:

ProductName | Price 
------------+---------- 
    A  | 2.50 
    A  | 3.50 
    B  | 9.99 

Использование GROUP BY Product.Name ORDER BY Price DESC не гарантированно вернуть самую высокую цену для каждого продукта. то есть

ProductName | Price 
------------+---------- 
    A  | 3.50 
    B  | 9.99 

То, что вы действительно говорите, «дайте мне одну цену для каждого продукта (любой ценой), то заказ окончательные результаты по цене». Таким образом, вы можете так же легко получить 2,50, так как цена на товар А я думаю, что вы могли бы получить результаты, которые вы хотите с помощью `MAX:

SELECT product.name, 
     Max(product.price) AS Price 
FROM purchased, 
     product 
WHERE purchased.date1 > '2013-11-02' 
GROUP BY product.name 
ORDER BY price DESC; 

Я подозреваю, что вы также отсутствует связь между продуктом и купил, это будет следует избегать, если you used the newer ANSI 92 explicit join syntax, неявных присоединиться синтаксис вы используете 20 лет неактуально:

Так окончательный запрос будет что-то вроде:

SELECT product.name, 
     Max(product.price) AS Price 
FROM purchased 
     INNER JOIN product 
       ON product.id = purchased.productid 
WHERE purchased.date1 > '2013-11-02' 
GROUP BY product.name 
ORDER BY price DESC; 

NB Я должен был догадываться о взаимосвязи между Продуктом и Приобретенным

+0

очень четкий ответ! +1 для подробного разъяснения. – Christos

0

Ссылаясь на ваш предыдущий вопрос. SQL Structure help and query Вот sqlfiddle

В запросе group by должен быть перед пунктом order by.

SELECT product.name, 
     product.price 
FROM purchased, 
     product 
WHERE purchased.date1 > '2013-11-02' 
GROUP BY product.name 
ORDER BY price DESC; 
Смежные вопросы