Новичок
Покинул форум
Сообщений всего: 21
Дата рег-ции: Февр. 2013
Помог: 0 раз(а)
|
Всем привет!
Не знаю, как составить хитрый запрос с сортировкой. Более подробно ниже.
Есть две таблицы:
CODE ( sql):
скопировать код в буфер обмена
CREATE TABLE IF NOT EXISTS `products` ( `id` int(11) NOT NULL AUTO_INCREMENT, `title` varchar(255) NOT NULL, `description` varchar(255) NOT NULL, `l` varchar(255) NOT NULL, `d` varchar(255) NOT NULL, `s` varchar(255) DEFAULT NULL, `status` varchar(255) DEFAULT NULL, `datecreate` datetime DEFAULT NULL, PRIMARY KEY (`id`), UNIQUE KEY `title_UNIQUE` (`title`), ) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;
CODE ( sql):
скопировать код в буфер обмена
CREATE TABLE IF NOT EXISTS `orders` ( `id` int(11) NOT NULL AUTO_INCREMENT, `datecreate` datetime DEFAULT NULL, `products_id` int(11) DEFAULT NULL, `users_id` int(10) UNSIGNED NOT NULL, `description` text, `paid` tinyint(1) DEFAULT '0', `price` decimal(10,2) DEFAULT NULL, PRIMARY KEY (`id`), KEY `fk_orders_users_id` (`users_id`) KEY `fk_orders_products_id` (`products_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;
Чтобы выводить постранично предварительно перемешав - с этим я разобрался след. образом:
CODE ( sql):
скопировать код в буфер обмена
SELECT `products`.`id`, `products`.`title`, `products`.`description`, `products`.`detecreate`, *произ.число* AS `ord`, FROM `products` WHERE `products`.`datecreate` IS NOT NULL ORDER BY RAND(ord) ASC LIMIT 20 OFFSET 0 (1)
,
А как сделать, чтобы позиции которые "оплачены" (имели статус paid = true в orders) и оплачены менее месяца назад (т.е. CURRENT() < ADDDATE(orders.datecreate, INTERVAL 1 MONTH) ), всегда были первыми в постраничной выдачи, но так же между собой сортировались произвольно, подскажите идею или в каком направлении смотреть, буду очень признателен
Не прошу готовый код, хотя не отказался бы от примерчика
Что уже придумал по советам людей:
CODE ( sql):
скопировать код в буфер обмена
SELECT `products`.`id`, `products`.`title`, `products`.`description`, `products`.`detecreate`, *произ.число* AS `ord`, FROM `products` LEFT JOIN `orders` ON (`orders`.`products_id` = `products`.`id`) WHERE `products`.`datecreate` IS NOT NULL AND CURRENT() < ADDDATE(`orders.datecreate`, INTERVAL 1 MONTH) ) ORDER BY `orders`.`paid` DESC, RAND(ord) ASC LIMIT 20 OFFSET 0 (1)
Если сделать так, то он выводит только те продукты у которых в ордере дата создания + 1 месяц > текущего времени, что вообще не нужно... Отредактировано модератором: Мелкий, 15 Мая, 2014 - 15:49:51 поправил подсветку синтаксиса на sql
|