Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Сортировка одной таблицы по условию из другой.

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (1): [1]   

> Без описания
nickstop
Отправлено: 15 Мая, 2014 - 15:31:35
Post Id


Новичок


Покинул форум
Сообщений всего: 21
Дата рег-ции: Февр. 2013  


Помог: 0 раз(а)




Всем привет!
Не знаю, как составить хитрый запрос с сортировкой. Более подробно ниже.

Есть две таблицы:
CODE (sql):
скопировать код в буфер обмена
  1. CREATE TABLE IF NOT EXISTS `products` (
  2.   `id` int(11) NOT NULL AUTO_INCREMENT,
  3.   `title` varchar(255) NOT NULL,
  4.   `description` varchar(255) NOT NULL,
  5.   `l` varchar(255) NOT NULL,
  6.   `d` varchar(255) NOT NULL,
  7.   `s` varchar(255) DEFAULT NULL,
  8.   `status` varchar(255) DEFAULT NULL,
  9.   `datecreate` datetime DEFAULT NULL,
  10.   PRIMARY KEY (`id`),
  11.   UNIQUE KEY `title_UNIQUE` (`title`),
  12. ) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;

CODE (sql):
скопировать код в буфер обмена
  1. CREATE TABLE IF NOT EXISTS `orders` (
  2.   `id` int(11) NOT NULL AUTO_INCREMENT,
  3.   `datecreate` datetime DEFAULT NULL,
  4.   `products_id` int(11) DEFAULT NULL,
  5.   `users_id` int(10) UNSIGNED NOT NULL,
  6.   `description` text,
  7.   `paid` tinyint(1) DEFAULT '0',
  8.   `price` decimal(10,2) DEFAULT NULL,
  9.   PRIMARY KEY (`id`),
  10.   KEY `fk_orders_users_id` (`users_id`)
  11.   KEY `fk_orders_products_id` (`products_id`)
  12. ) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;
  13.  

Чтобы выводить постранично предварительно перемешав - с этим я разобрался след. образом:
CODE (sql):
скопировать код в буфер обмена
  1.  
  2. SELECT
  3.  `products`.`id`,
  4.  `products`.`title`,
  5.  `products`.`description`,
  6.  `products`.`detecreate`,
  7.   *произ.число* AS `ord`,
  8. FROM `products`
  9. WHERE `products`.`datecreate` IS NOT NULL
  10. ORDER BY RAND(ord) ASC LIMIT 20 OFFSET 0 (1)
  11.  
,

А как сделать, чтобы позиции которые "оплачены" (имели статус paid = true в orders) и оплачены менее месяца назад (т.е. CURRENT() < ADDDATE(orders.datecreate, INTERVAL 1 MONTH) ), всегда были первыми в постраничной выдачи, но так же между собой сортировались произвольно, подскажите идею или в каком направлении смотреть, буду очень признателенУлыбка

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

Что уже придумал по советам людей:

CODE (sql):
скопировать код в буфер обмена
  1. SELECT
  2.  `products`.`id`,
  3.  `products`.`title`,
  4.  `products`.`description`,
  5.  `products`.`detecreate`,
  6.   *произ.число* AS `ord`,
  7. FROM `products`
  8. LEFT JOIN `orders`
  9.  ON (`orders`.`products_id` = `products`.`id`)
  10. WHERE `products`.`datecreate` IS NOT NULL
  11.      AND CURRENT() < ADDDATE(`orders.datecreate`, INTERVAL 1 MONTH) )
  12. ORDER BY  `orders`.`paid` DESC, RAND(ord) ASC LIMIT 20 OFFSET 0 (1)
  13.  


Если сделать так, то он выводит только те продукты у которых в ордере дата создания + 1 месяц > текущего времени, что вообще не нужно...


Отредактировано модератором: Мелкий, 15 Мая, 2014 - 15:49:51
поправил подсветку синтаксиса на sql
 
 Top
valenok
Отправлено: 15 Мая, 2014 - 18:05:38
Post Id



Здесь могла бы быть ваша реклама


Покинул форум
Сообщений всего: 4574
Дата рег-ции: Июль 2006  
Откуда: Israel


Помог: 3 раз(а)




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


1. Сначала выбрать те товары, которые должны быть на первой странице
2. Потом отдельно их отсортировать случайным образом

CODE (SQL):
скопировать код в буфер обмена
  1.  
  2. SELECT * FROM
  3. (
  4.  
  5.         SELECT products.*
  6.         FROM `products`
  7.         LEFT JOIN `orders`
  8.          ON `orders`.`products_id` = `products`.`id`
  9.          AND orders.paid = 1
  10.          AND DATE_SUB(NOW(), INTERVAL 1 MONTH) < orders.datecreate
  11.         LIMIT 20
  12.  
  13. ) ORDER BY RAND()
  14.  


-----
Truly yours, Sasha.
 
My status
 Top
nickstop
Отправлено: 17 Мая, 2014 - 12:49:14
Post Id


Новичок


Покинул форум
Сообщений всего: 21
Дата рег-ции: Февр. 2013  


Помог: 0 раз(а)




valenok, Благодарю! Пробовал данную конструкцию:
1. запрос выполняется очень долго, 0.01 - 0,1 сек. , это при моих сейчас мизерных данных...
2. С остальными записями не пойму как поступитьУлыбка т.е. как запрос составить дальшеУлыбка

Пробовал еще через UNION, как посоветовали (
1 запрос выбирал все товары orders.paid=1 и CURRENT() < ADDDATE(`orders.datecreate`, INTERVAL 1 MONTH) )
a 2 запрос все продукты ), но в данном случае сортировка по полю `ord` не работает... Может есть какие идеи?
(Добавление)
Может кто подскажет как сортировать по псевдополю, когда есть UNION?
Т.е.

CODE (SQL):
скопировать код в буфер обмена
  1. (SELECT
  2.    *, 123 AS `ord`
  3. FROM
  4.    products
  5. )
  6.  
  7. UNION
  8. (SELECT
  9.    *, 123 AS `ord`
  10. FROM
  11.    products2
  12. )
  13. ORDER BY RAND(`ord`)
- такая конструкция не работает.

(Отредактировано автором: 17 Мая, 2014 - 12:56:04)

 
 Top
nickstop
Отправлено: 17 Мая, 2014 - 18:43:38
Post Id


Новичок


Покинул форум
Сообщений всего: 21
Дата рег-ции: Февр. 2013  


Помог: 0 раз(а)




Сделал вот как:

CODE (SQL):
скопировать код в буфер обмена
  1. SELECT  * , 234123 AS `ord`
  2. FROM
  3. (
  4.   (
  5.     SELECT *
  6.     FROM products
  7.     LEFT JOIN `orders`
  8.      ...
  9.   )
  10.  
  11.   UNION
  12.  
  13.   (
  14.     SELECT *
  15.     FROM products
  16.     LEFT OUTER JOIN `orders`
  17.     ....
  18.   )
  19.    
  20. )
  21. ORDER BY RAND('ord)

При данном запросе задача решается частично, т.е. позиции не перемешивается в SELECT, который идет в перед UNION
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« SQL и Архитектура БД »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB