Сортировка товаров в каталоге

sage

Новичок
Сортировка товаров в каталоге

Есть каталог товаров:

[sql]
CREATE TABLE `catalogue_catalogue` (
`modelid` mediumint(8) unsigned NOT NULL auto_increment,
`categoryid` smallint(5) unsigned NOT NULL,
PRIMARY KEY (`modelid`),
KEY `categoryid` (`categoryid`)
);
[/sql]

И таблица товаров в заказе:

[sql]
CREATE TABLE `shop_orders_data` (
`orderid` mediumint(8) unsigned NOT NULL,
`modelid` mediumint(8) unsigned NOT NULL,
KEY `orderid` (`orderid`),
KEY `modelid` (`modelid`)
);
[/sql]

как отсортировать вывод товаров из `catalogue_catalogue` по кол-ву вхождений в заказы из `shop_orders_data`. Проблема в товарах, которым нет соответствия в `shop_orders_data`. Заранее спасибо.
 

sage

Новичок
тут всё просто. товары, которые покупались ранее:

[sql]
SELECT `t1`.`modelid`
FROM `catalogue_catalogue` `t1`, `shop_orders_data` `t2`
WHERE `t2`.`modelid` = `t1`.`modelid`
GROUP BY `t2`.`modelid`
ORDER BY COUNT(`t2`.`modelid`) DESC
[/sql]

-~{}~ 31.01.09 17:18:

а вот как вытащить те, котор не покупались....
 

Glazyrin Sergey

Новичок
SELECT `t1`.`modelid`
FROM `catalogue_catalogue` `t1`
LEFT JOIN `shop_orders_data` `t2` ON `t2`.`modelid` = `t1`.`modelid`
GROUP BY `t2`.`modelid`
ORDER BY IF (
`t2`.`modelid` <> NULL , COUNT( `t2`.`modelid` ) , 0
) DESC
У меня работает
 

Glazyrin Sergey

Новичок
2 и 2 выводит
притом что для второго записи в таблице второй нет

-~{}~ 02.02.09 15:21:

Так тоже работает
SELECT `t1`.`modelid` , COUNT( `t2`.`modelid` )
FROM `catalogue_catalogue` `t1`
LEFT JOIN `shop_orders_data` `t2` ON `t2`.`modelid` = `t1`.`modelid`
GROUP BY `t2`.`modelid`
ORDER BY COUNT( `t2`.`modelid` ) DESC
 

sage

Новичок
хм. а у меня только один выводит. самый первый добавленный.
 

Glazyrin Sergey

Новичок
CREATE TABLE `catalogue_catalogue` (
`modelid` mediumint(8) unsigned NOT NULL auto_increment,
`categoryid` smallint(5) unsigned NOT NULL,
PRIMARY KEY (`modelid`),
KEY `categoryid` (`categoryid`)
) ENGINE=MyISAM AUTO_INCREMENT=3 DEFAULT CHARSET=utf8 AUTO_INCREMENT=3 ;

--
-- Дамп данных таблицы `catalogue_catalogue`
--

INSERT INTO `catalogue_catalogue` (`modelid`, `categoryid`) VALUES (1, 1);
INSERT INTO `catalogue_catalogue` (`modelid`, `categoryid`) VALUES (2, 2);

-- --------------------------------------------------------

--
-- Структура таблицы `shop_orders_data`
--

CREATE TABLE `shop_orders_data` (
`orderid` mediumint(8) unsigned NOT NULL,
`modelid` mediumint(8) unsigned NOT NULL,
KEY `orderid` (`orderid`),
KEY `modelid` (`modelid`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

--
-- Дамп данных таблицы `shop_orders_data`
--

INSERT INTO `shop_orders_data` (`orderid`, `modelid`) VALUES (1, 1);

Вот мой sql dump
 

sage

Новичок
добавь, пжл, ещё парочку записей в `catalogue_catalogue` и результат ;)
 

Glazyrin Sergey

Новичок
SELECT `t1`.`modelid` , (

SELECT COUNT( * )
FROM `shop_orders_data` `t2`
WHERE `t2`.`modelid` = `t1`.`modelid`
) AS c
FROM `catalogue_catalogue` `t1`
ORDER BY c DESC
А так ?

-~{}~ 02.02.09 16:16:

Или вариант
SELECT `t1`.`modelid` , COUNT( `t2`.`modelid` )
FROM `catalogue_catalogue` `t1`
LEFT JOIN `shop_orders_data` `t2` ON `t2`.`modelid` = `t1`.`modelid`
GROUP BY `t1`.`categoryid`
ORDER BY COUNT( `t2`.`modelid` ) DESC
 

sage

Новичок
[sql]
SELECT `t1`.`modelid` , COUNT( `t2`.`modelid` )
FROM `catalogue_catalogue` `t1`
LEFT JOIN `shop_orders_data` `t2` ON `t2`.`modelid` = `t1`.`modelid`
GROUP BY `t1`.`categoryid`
ORDER BY COUNT( `t2`.`modelid` ) DESC
[/sql]

вроде, работает. спасибо :)
 

x-yuri

Новичок
sage а что у тебя `t1`.`categoryid` == `t2`.`modelid`?
думаю, что типа такого должно быть
[sql]SELECT `t1`.`modelid` , IF( `t2`.`modelid` IS NULL, 0, COUNT( `t1`.`modelid` )) cnt
FROM `catalogue_catalogue` `t1`
LEFT JOIN `shop_orders_data` `t2` ON `t2`.`modelid` = `t1`.`modelid`
GROUP BY `t1`.`modelid`
ORDER BY cnt DESC[/sql]
 

Glazyrin Sergey

Новичок
Там надо думать - EXPLAIN там плохой , использует filesort. поэтому смотри

-~{}~ 02.02.09 16:30:

Да и во втором варианте недостаток - он накладывает ограничения на данные в первой таблице... Поэтому смотри.
EXPLAIN у тех двух запросов одинаковый, какой из них юзать

-~{}~ 02.02.09 16:31:

P.S. Каюсь, да уж не подумал чуть чуть
x-yuri правильно говорит
Такое получше:
SELECT `t1`.`modelid` , COUNT( `t2`.`modelid` )
FROM `catalogue_catalogue` `t1`
LEFT JOIN `shop_orders_data` `t2` ON `t2`.`modelid` = `t1`.`modelid`
GROUP BY `t1`.`modelid`
ORDER BY COUNT( `t2`.`modelid` ) DESC

-~{}~ 02.02.09 16:34:

Кстати x-yuri твой запрос - explain похужей чем у моего первого
 

sage

Новичок
x-yuri
я не использовал запрос Glazyrin Sergey ;) взял только идею :) безусловно, в конечном запросе там `t1`.`modelid`.
 
Сверху