Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > MySQL > ORDER BY


Автор: FRAGNATIC 19.5.2006, 15:06
Код

Create table Items
(
   id int,
   p1 int,
   p2 int
)

Вот нужно сортировать эти записи по p1 и p2 ) причём по какому-то одному из этих полей, но именно наименьшему, при этом если п1 = 0, то тогда сортировать по п2, вообщем 0 не считать.
Допустим
id = 1 p1 = 9 p2 = 0;
id = 2 p1 = 0 p2 = 8;
id = 3 p1 = 0 p2 = 7;
id = 4 p1 = 6 p2 = 7;
id = 5 p1 = 7 p2 = 6;
должно вывести в таком порядке по ИД перечислю
4,5,3,2,1
Надеюсь понятно объяснил.
Как вариант предлогали сортировать по сумме п1+п2, но не совсем корек-то выходит когда одно из п равно 0, то тогда всё гуд типа 9+0,
но а вот 6+7 уже не тот получается =) 

Автор: Ignat 19.5.2006, 15:16
Если я тебя правильно понял.

Код

SELECT *, IF(`p1`<`p2`, `p1`, `p2`) AS `ordering`FROM `Items` ORDER BY `ordering` DESC ;
   

Автор: FRAGNATIC 19.5.2006, 15:29
Ignat, Спасибо.
Новерное правильно понял
Я думал что IF нету )
Где про использование IF можно почитать?
из выше написаного кода я понял синтаксис такой
if(условие, если верно то это значение, иначе это)
IF(`p1`<`p2`, `p1`, `p2`) =)
 

Автор: Ignat 19.5.2006, 15:34
Цитата(FRAGNATIC @  19.5.2006,  16:29 Найти цитируемый пост)
из выше написаного кода я понял синтаксис такой

Совершенно верно.

Цитата(FRAGNATIC @  19.5.2006,  16:29 Найти цитируемый пост)
Где про использование IF можно почитать?

В мануале =)
http://dev.mysql.com/doc/refman/4.1/en/control-flow-functions.html

Добавлено @ 15:46 
FRAGNATIC, Получилось? 

Автор: FRAGNATIC 19.5.2006, 16:16
Не совсем)
это пашет 
Код

SELECT i.Item_id, COUNT(*) AS num, COUNT(DISTINCT(o.Order_id)) AS sales 
FROM (fb_items i, fb_users u) 
LEFT JOIN fb_words w ON w.Item_id=i.Item_id 
LEFT JOIN fb_orders o ON o.Item_id = i.Item_id AND o.IsPaid = 'Y' 
WHERE i.User_id=u.User_id AND u.IsActive=1 AND i.IsActive=1 AND i.IsRejected=0 
AND (((`Price1` !=0 OR (i.Price2 != 0 AND i.IsExclusive != 0)) AND IsExclSale != 1
AND IsHide != 1 ))
GROUP BY i.Item_id 
ORDER BY u.Group_id DESC, i.Price1 DESC

а это нет 
Код

SELECT i.Item_id,  IF(i.Price1<i.Price2, 'i.Price1', `i.Price2`) AS ordering, COUNT(*) AS num, COUNT(DISTINCT(o.Order_id)) AS sales 
FROM (fb_items i, fb_users u) 
LEFT JOIN fb_words w ON w.Item_id=i.Item_id 
LEFT JOIN fb_orders o ON o.Item_id = i.Item_id AND o.IsPaid = 'Y' 
WHERE i.User_id=u.User_id AND u.IsActive=1 AND i.IsActive=1 
AND i.IsRejected=0 AND (((`Price1` !=0 OR (i.Price2 != 0 AND i.IsExclusive != 0)) 
AND IsExclSale != 1 AND IsHide != 1 )) 
GROUP BY i.Item_id 
ORDER BY u.Group_id DESC, ordering DESC

Цитата
Error occurred:
Unknown column 'i.Price2' in 'field list'


+ надобы предусмотреть что одно из значение может быть 0
Есть ли чёнить типа ELSE или ELSEIF ?  

Автор: FRAGNATIC 19.5.2006, 16:35
Вообщем по смыслу надо что-то типа этого
имеем Price1 и Price2
Код

if(Price1<Price2 AND Price1!=0)
{
   Price = Price1
} elseif(Price2!=0)
{
  Price = Price2
}

и в итоге ORDER BY Price;
 

Автор: Ignat 19.5.2006, 16:43
Попробуй:
Код

SELECT i.Item_id,  IF(`i`.`Price1`<`i`.`Price2`, IF(`i`.`Price1`,`i`.`Price1`, `i`.`Price2`), `i`.`Price2`)  AS ordering, COUNT(*) AS num, COUNT(DISTINCT(o.Order_id)) AS sales 
FROM (fb_items i, fb_users u) 
LEFT JOIN fb_words w ON w.Item_id=i.Item_id 
LEFT JOIN fb_orders o ON o.Item_id = i.Item_id AND o.IsPaid = 'Y' 
WHERE i.User_id=u.User_id AND u.IsActive=1 AND i.IsActive=1 
AND i.IsRejected=0 AND (((`Price1` !=0 OR (i.Price2 != 0 AND i.IsExclusive != 0)) 
AND IsExclSale != 1 AND IsHide != 1 )) 
GROUP BY i.Item_id 
ORDER BY u.Group_id DESC, ordering DESC
 

Автор: Akina 19.5.2006, 16:43
Код

if(price1*price2=0, price1+price2, if(price1<price2, price1, price2)) AS price
 

Автор: Ignat 19.5.2006, 16:45
Akina, классно =) 

Автор: FRAGNATIC 19.5.2006, 17:03
Респект всем!
Спасибо! 

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