Всем привет! Не знаю, как составить хитрый запрос с сортировкой. Более подробно ниже. Есть две таблицы: Код (Text): 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 ; Код (Text): 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 ; Чтобы выводить постранично предварительно перемешав - с этим я разобрался след. образом: Код (Text): 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) , всегда были первыми в постраничной выдачи, но так же между собой сортировались произвольно, подскажите идею или в каком направлении смотреть, буду очень признателен Маленький апдэйт. А как сделать, чтобы позиции которые "оплачены" (имели статус paid = true в orders) и оплачены менее месяца назад (т.е. CURRENT() < ADDDATE(orders.datecreate, INTERVAL 1 MONTH) ), всегда были первыми в постраничной выдачи, но так же между собой сортировались произвольно, подскажите идею или в каком направлении смотреть, буду очень признателен Не прошу готовый код, хотя не отказался бы от примерчика
Спасибо за ответ В таком случае, как я понимаю, нужно делать через JOIN orders. Но это решает только часть задачи а как вот их перемешивать?) Добавлено спустя 59 минут 18 секунд: Код (Text): 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 ORDER BY `orders`.`paid` DESC, RAND(ord) ASC LIMIT 20 OFFSET 0 (1) Получилась вот такая петрушка - просто оказалось... Но не понимаю как выполнить вот это: ... и оплачены менее месяца назад (т.е. CURRENT() < ADDDATE(orders.datecreate, INTERVAL 1 MONTH) ) ...
Код (Text): 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 месяц > текущего времени, что вообще не нужно... Может кто еще идей подкинет...
ну ты сам написал такое условие =) Добавлено спустя 37 секунд: AND CURRENT() < ADDDATE(`orders.datecreate`, INTERVAL 1 MONTH) = текущего времени < дата создания + 1 месяц
Данный запрос выведет только те записи, в которых выполняется данное условие (AND CURRENT() < ADDDATE(`orders.datecreate`, INTERVAL 1 MONTH) ), а остальные продукты просто проигнорирует Уже проверил работу это запроса А мне нужно, что продукты удовлетворяющие этому условию были первыми в выдаче среди остальных)
ну так не пиши это условие, раз тебе оно не нужно =) чувак. ты чего хочешь-то? Добавлено спустя 19 секунд: UNION и два запроса.
Тестил, пробовал... два запроса по одиночке произвольно сортируются, но когда делаем UNION - все, каюк, никакой рамдомности в SELECT'aх нет Код (Text): (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) ) [b]ORDER BY RAND(ord) ASC [/b]) - это не срабатывает при юнион Такой вот запрос: Код (Text): (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) ) AND `orders`.`paid` = 1 ORDER BY RAND(ord) ASC ) UNION (SELECT `products`.`id`, `products`.`title`, `products`.`description`, `products`.`detecreate`, *произ.число* AS `ord`, FROM `products` WHERE `products`.`datecreate` IS NOT NULL ORDER BY RAND(ord) ASC ) при изменении произвольного числа, по идее должны перемешиваться строки, но этого не происходит так же добавлял ORDER BY RAND(ord) ASC Код (Text): ( SELECT ... ) union (SELECT ) ORDER BY RAND(ord) ASC все равно нуль реакции
Перерыл гуглю яндексом и ничего... Как я понимаю в UNION по "псевдополю" в низя походу сделать ORDER BY...
Сделал вот как: Код (Text): SELECT * , 234123 as `ord` FROM ( ( SELECT * FROM products LEFT JOIN `orders` ... ) UNION ( SELECT * FROM products LEFT OUTER JOIN `orders` .... ) ) ORDER BY RAND('ord) При данном запросе задача решается частично, т.е. позиции не перемешивается в SELECT, который идет в перед UNION
Еще какая матрешка... Ну как сказать скорость, что то нужно придумать по-правильнее... не быстро... при моих данных, а это 1/10 от реальной, по phpmyadmin запрос примерно 0.008 - 0.01 .. Пока как лучше придумать я хз...
Подскажите с запросом пожалуйста Нужно выбрать из первой (products) все, кроме тех, что во второй (orders) имеют `orders`.`paid` = 0 и CURENT() вне периода `orders`.`datecreate` + 1 месяц , а ну и соответственно именно эти и не брать `products`.`id` = `orders`.`products_id` )
Код (Text): SELECT * FROM products p WHERE p.id NOT IN (SELECT products_id FROM orders o WHERE o.paid=0 AND (CURDATE() < o.datacreate OR CURDATE() > DATE_ADD(o.datacreate, INTERVAL +1 MONTH))) Решение простое, как две копейки! Благодарен, человеку, кто подсказал К моей матрешки прибавился еще запросик Походу вешайся сервер!