Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Базы Данных > Помогите составить запрос (хит продаж)


Автор: bankir 12.5.2009, 12:03
Всем привет.
Есть такая задача:

есть таблица orders с полями id, textid, quantity (порядковый номер, айди товара, количество товара) - это архив заказов.
нужно вывести хиты продаж, т.е. позиции которые больше всех продавались по формуле колич товара*колич вхождений этого товара в таблице
на данный момент написал вот так, что выглядит очень коряво и ужасно - через ж..у
Код

$sql="select distinct(textid) from orders";   //запрашиваем уникальные записи
$r=mysql_query($sql);

for ($i=0;$i<mysql_num_rows($r);$i++){
    $f=mysql_fetch_array($r);
    $sql_count="select sum(quantity) from orders where textid='$f[0]'";    //запрашиваем количество
    $r_count=mysql_query($sql_count);
    $f_count=mysql_fetch_array($r_count);
    $array1[]=$f[0];                                               //вот тут вообще идет все через ж, потому что не понял как сортировать ассоц массив
    $array2[]=$f_count[0];
    
}

$array=array_combine($array1,$array2);
arsort($array);                 //сортирую массив
$array1=array_keys($array);
$array2=array_values($array);

for ($i=0;$i<2;$i++){                       //здесь начинаю вывод первых 2 позиций у которых продажи больше всех
    if(isset($array1[$i])){
        $sql="select * from items where textid='$array1[$i]'";
        $r=mysql_query($sql);
        $f=mysql_fetch_array($r);


подскажите пожалуйста как можно сделать поставленную задачу нормально, а не как у меня. Если можно приведите примеры с кусками кода.

Заранее благодарен.


Автор: Akina 12.5.2009, 12:24
Цитата(bankir @  12.5.2009,  13:03 Найти цитируемый пост)
позиции которые больше всех продавались по формуле колич товара*колич вхождений этого товара в таблице

т.е. sum(quantity)*count(quantity), что ли?
Код

$sql="select textid, sum(quantity)*count(quantity) as rank from orders order by rank desc limit 1"; 
$r=mysql_query($sql);

Автор: bankir 12.5.2009, 12:34
Цитата(Akina @ 12.5.2009,  12:24)
т.е. sum(quantity)*count(quantity), что ли?

наверное я неправильно выразился,
например "арт А1 Кофеварка" встречается в этой таблице 5 раз, по 1шт, 2, 2, 1,3шт соответственно
таким образом общее количество будет 9шт
а "арт А2 Нож" встречается 1 раз с количеством 1шт,
значит хит продаж будет кофеварка со своими 9 штуками.
и мне надо вот так взять например первые 3 позиции с максимальными продажами

Автор: Akina 12.5.2009, 12:40
bankir, ты сам себе же и противоречишь. Неужели так трудно понять, что же ТЕБЕ надо?

Цитата(bankir @  12.5.2009,  13:34 Найти цитируемый пост)
мне надо вот так взять например первые 3 позиции с максимальными продажами 

Код

$sql1="select textid, sum(quantity)*count(quantity) as rank from orders order by rank desc limit 3"; 
$sql2="select textid, sum(quantity) as rank from orders order by rank desc limit 3"; 

Выбирай.

Автор: bankir 12.5.2009, 12:51
Цитата(Akina @ 12.5.2009,  12:40)
bankir, ты сам себе же и противоречишь. Неужели так трудно понять, что же ТЕБЕ надо?

Цитата(bankir @  12.5.2009,  13:34 Найти цитируемый пост)
мне надо вот так взять например первые 3 позиции с максимальными продажами 

Код

$sql1="select textid, sum(quantity)*count(quantity) as rank from orders order by rank desc limit 3"; 
$sql2="select textid, sum(quantity) as rank from orders order by rank desc limit 3"; 

Выбирай.

к сожалению твой код выдает ошибку
#1140 - Mixing of GROUP columns (MIN(),MAX(),COUNT(),...) with no GROUP columns is illegal if there is no GROUP BY clause 

Автор: Akina 12.5.2009, 13:23
Ну добавь group by textid

Автор: bankir 12.5.2009, 13:27
всем спасибо, 

сделал так:
Код

SELECT textid, SUM( quantity ) AS  'quant'
FROM orders
GROUP BY textid order by quant desc



Akina спасибо огромное за помощь, твое последнее сообщение не увидел
жаль у меня нет 100 постов, так бы поставил тебе +

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)