2012-02-27 5 views
1

Я работаю над простыми запросами, чтобы узнать MySQL, в моей базе данных примеров я отслеживаю магазины, которые продают электронные устройства, у меня есть таблица Sells (Store, Item, Price) ,Поиск 2 самых дорогих продуктов в MySQL

И пример данных,

'Best Buy', 'Galaxy S', 1000 
'Buy More', 'Macbook Air', 2000 
'Best Buy', 'Microsoft Mouse', 20 
'Best Buy', 'Macbook Pro Cover', 40 
'Buy More', 'Asus Zenbook', 2000 

И так далее ..

Я попробовал следующее SQL заявление, но он говорит: Код

Ошибка: 1111. Неправильное использование групповая функция 0,000 с

SELECT store 
FROM sells 
WHERE SUM(price) < 
     (SELECT SUM(price) AS total 
     FROM sells 
     GROUP BY store 
     ORDER BY total DESC 
     LIMIT 1) 
GROUP BY store 
ORDER BY SUM(price) DESC 

Я бы признателен, если вы можете помочь мне

Благодаря

+0

Не уверен, что я понимаю, вы просто хотите суммировать все цены за магазин, не заботясь о фактических проданных продуктах? –

+0

Будьте осторожны, запрос, который вы придумали, кажется, работает, в следующий раз, когда вы его выполните, результаты могут быть разными. Тем не менее, ваша проблема аналогична общей проблеме с наибольшей-n-на-группой, но не совсем. – AndreKR

+0

@JoachimIsaksson Да, я просто хочу суммировать все цены за каждый магазин, а затем оценивать их. – CanCeylan

ответ

4

Это будет просто показать второй самый дорогой магазин;

SELECT STORE 
FROM TABLE_A 
GROUP BY STORE 
ORDER BY SUM(PRICE) DESC 
LIMIT 1,1 

Демо-версия here.

Если вы хотите, чтобы цена отображалась тоже, вы можете просто выбрать ее;

SELECT STORE, SUM(PRICE) TOTAL_PRICE 
FROM TABLE_A 
GROUP BY STORE 
ORDER BY TOTAL_PRICE DESC 
LIMIT 1,1 

Демонстрация here.

Редактировать: Если у вас есть несколько самых дорогих магазинов и несколько второстепенных самых дорогих магазинов, запрос на получение всех вторых самых дорогих становится немного более запутанным; Я уверен, что кто-то может победить эффективность этого;

SELECT STORE, SUM(PRICE) TOTAL_PRICE 
FROM TABLE_A 
GROUP BY STORE 
HAVING TOTAL_PRICE = 
    (SELECT SUM(PRICE) TMP 
    FROM TABLE_A 
    GROUP BY STORE 
    HAVING TMP < 
    (SELECT SUM(PRICE) TMP2 
     FROM TABLE_A 
     GROUP BY STORE 
     ORDER BY TMP2 DESC 
     LIMIT 1) 
    ORDER BY TMP DESC LIMIT 1) 

Демо-версия here.

+0

Во-первых, спасибо! Что делает LIMIT 1,1? Я пытался написать другой подзапрос, который является суммарным максимальным, но меньшим, чем максимальный – CanCeylan

+0

@CanCeylan LIMIT x, y означает пропустить первые x строк (самые дорогие) и вернуть следующий. Другими словами, в этом случае пропустите самый дорогой магазин и верните второй самый дорогой. –

+0

Но в таком случае, например, если у меня есть 2 магазина с равными итогами, я не получу два из них правильно? – CanCeylan

0

SELECT distinct price from sells ORDER BY price DESC, и в вашем коде, просто взять второй.

Если вам нужен остальной информации, сделайте следующее:

SELECT * from sells 
WHERE price = (SELECT distinct price from sells ORDER BY price DESC LIMIT 1,1) 
0

не проверял, но должно работать

SELECT S.store 
FROM (
SELECT SUM(T.price) AS sum_price 
FROM formList_Total AS T 
GROUP BY T.store 
) AS S 
ORDER BY sum_price DESC 
LIMIT 1 , 1 

К сожалению, пошли на тестирование, вот то, что я закончил с ,

+0

Но я хочу рассчитать все цены для каждого магазина, как вы рассчитываете их суммирование? – CanCeylan

+0

там, извините, неверно прочитано –

+0

Он говорит: «Код ошибки: 1064. У вас есть ошибка в синтаксисе SQL, проверьте руководство, соответствующее версии вашего сервера MySQL, для правильного синтаксиса для использования рядом с« GROUP BY store » – CanCeylan

1

Вы можете сделать это следующим образом;

SELECT *, 
SUM(price) AS totalprice 
FROM sells 
GROUP BY store 
ORDER BY totalprice DESC 
LIMIT 2 

Сначала вы выбираете сумму цен и храните ее временно для ex. totalprice, тогда как вы уже делали группу по магазинам. Чтобы получить самые дорогие магазины, закажите сумму назад, а затем ограничитесь двумя результатами.

Вы сможете получить totalprice так же, как обычный колонке, когда вы цикл из результатов

1

почти правильные,

SELECT SUM(price) as price_total FROM sells GROUP BY store 

если вы хотите приказать вы можете сделать подзапрос, как:

SELECT price_total FROM (SELECT SUM(price) as price_total FROM sells GROUP BY store) as res ORDER BY price LIMIT 2 

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

+0

Можете ли вы посмотрите на редактирование, пожалуйста? – CanCeylan

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