powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Запрос MYSQL
17 сообщений из 17, страница 1 из 1
Запрос MYSQL
    #38397895
igurman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Приветствую форумчан !
Выходит проблема с запросом :

SELECT * from ob moder=1 ORDER by block_price DESC, block_time DESC, last_time DESC LIMIT $p1,$p2

block_price = стоимость платного размещения объявления - чем больше тем выше должно быть ( если нет = 0 )
block_time = время размещения с момента оплаты + 1 сутки ( если нет = 0 )
last_time = последнее время редактирования объявления ( при добавлении = php time() )

Косяки тут разные видимо по порядку идут ...
первой идет ORDER by block_price ... хотя они по дефолту нулевые
потом block_time он тоже может быть нулевым
а только потом last_time = добавление или время редактирования объявления

в итоге объявления почему то криво показываются ... новые после старых ... логика нарушена .. явно )) побороть не в силах ))

ПОМОГИТЕ ! ))) Не в курю как запрос сделать корректно, чтобы он отображал вот так:

- Если есть платные объявления то они сверху по убыванию стоимости .. и если они есть то и по времени (так как цена может быть одна а время разное).. а уже потом все другие объявления по убыванию last_time ..
...
Рейтинг: 0 / 0
Запрос MYSQL
    #38397909
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
igurmanпервой идет ORDER by block_price ... хотя они по дефолту нулевые"нулевые" - это NULL или 0 ?

Приведите пример исходных данных и желаемого результата.
...
Рейтинг: 0 / 0
Запрос MYSQL
    #38397918
Arhat109
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
igurman,

в предположении, что block_price и block_time -- целые положительные числа (если нет, то можно туда преобразовать или изменить соответственно)
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
SET @MAX_TIME = 1000;
-- # константа, значения больше которой поле block_time иметь не может!
-- # можно воткнуть прямо в запрос или как ещё доавить (с клиента или в ХП)...
..
ORDER BY IF(block_price <> 0
  -- # платные объявления: считаем интегральную весовую функцию и по ней сортируем по убыванию:
    , block_price * @MAX_TIME + block_time;
  -- # неплатники сортируем по убыванию поля last_time:
    , last_time
    ) DESC
...
Рейтинг: 0 / 0
Запрос MYSQL
    #38397921
Arhat109
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Arhat109,

в чистом виде работать не будет, но как идея - пойдет. Там надо разрулить диапазоны итоговой функции и значений поля last_time. Последние должны быть меньше пенрвых "в целом".
...
Рейтинг: 0 / 0
Запрос MYSQL
    #38397922
igurman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
block_price block_time = int (13) по умолчанию None ( сейчас все = 0 )
...
Рейтинг: 0 / 0
Запрос MYSQL
    #38397935
igurman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Arhat109igurman,

в предположении, что block_price и block_time -- целые положительные числа (если нет, то можно туда преобразовать или изменить соответственно)
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
SET @MAX_TIME = 1000;
-- # константа, значения больше которой поле block_time иметь не может!
-- # можно воткнуть прямо в запрос или как ещё доавить (с клиента или в ХП)...
..
ORDER BY IF(block_price <> 0
  -- # платные объявления: считаем интегральную весовую функцию и по ней сортируем по убыванию:
    , block_price * @MAX_TIME + block_time;
  -- # неплатники сортируем по убыванию поля last_time:
    , last_time
    ) DESC



Конечно пойдет если котлеты умножить на мухи ))) явно решение не в это русле )) Но спасибо )
...
Рейтинг: 0 / 0
Запрос MYSQL
    #38397942
Arhat109
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
igurman,

вам кушать или штоб работало? Суть идеи, как Вы и хотели: если платник, то сортируем по нужному нам правилу, иначе - все остальные по последнему изменению в порядке убывания. Отмасштабируйте самостоятельно на ваших фактах.
...
Рейтинг: 0 / 0
Запрос MYSQL
    #38397960
igurman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Arhat109igurman,

вам кушать или штоб работало?

Уважаемый Arhat109 ну конечно же, чтобы работало нужно )) я насколько понимаю это условие IF = ВЗАИМОИСКЛЮЧАЕМОЕ, а мне в данном случае нужно последовательно получить с условиями. Ума нет чтобы понять как сделать )) сори .. был бы премного благодарен за более развернутый рабочий ответ с как минимум тремя не взаимоисключающими условиями а дополняющими... Возможна благодарность за работу и восстановление колорий в WMR в частности 8-) !
...
Рейтинг: 0 / 0
Запрос MYSQL
    #38397988
Stupid_BOT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
igurman,
Код: sql
1.
2.
3.
select ... where block_price != 0 order by block_price DESC, block_time DESC, last_time DESC
union all
select ... where block_price = 0 order by last_time DESC
...
Рейтинг: 0 / 0
Запрос MYSQL
    #38398052
Arhat109
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
igurman,

Один вариант Вам предложили: через Юнион.

Условие в IF - не столько "взаимоисключающее", сколько "дополняющее": там просто разделяется ситуация на два случая, так как вы и написали: если платник, то выдаем такой вес для сортировки, иначе - другой. Всё. Единственное что нужно - откалибровать значения, но ЭТО можете сделать только самостоятельно. У меня нет диапазонов, которые могут принимать ваши поля - а стало быть вам и принимать решения по весовым коэфициентам. Могу показать на примере:

Пусть "стоимость баннера" находится в диапазоне: [0 .. 100_000] руб., время размещения: [0 .. 1000] дней (если у вас время в виде даты, то переведите его в количество дней - см. справочник функций для дат) и поле last_time - типа datetime (дата/время последнего обновления).

Вам надо, чтобы когда баннер есть, то результат вычисления по block_price и block_time был заведомо больше чем по last_time. Этого проще всего достичь, если сделать число, производное от last_time - отрицательным. Оно будет заведомо меньше любого положительного числа.

Соответственно, получить количество дней, да ещё и отрицательное из last_time можно вычитанием дат: DATE_DIFF(last_time, NOW()) и, заметьте что чем дальше от сегодня - тем более отрицательное число вы получите. Что нам и надо.

Далее. Если платник, то надо сортировать по уменьшению block_price И по уменьшению
...
Рейтинг: 0 / 0
Запрос MYSQL
    #38398068
Arhat109
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
промах по клаве, продолжение:

и по уменьшению block_time. Если block_time тоже дата/время, то применяем тот же финт с датой: DATE_DIFF(block_time, NOW()).

Чтобы вес времени размещения не влиял на сортировку по стоимости, стоимость надо "сдвинуть" в бОльший диапазон значений... то есть умножить на число заведомо большее наибольшего значения этой разницы "в днях". В примере я оговорил это как наибольшее значение поля last_time = 1000.

Если поля могут принимать NULL, то прямое обращение к ним заменяем на функцию IFNULL(поле, 0)

Итого получим:
Код: sql
1.
2.
3.
4.
ORDER BY IF( IFNULL(block_price,0) <> 0
  , IFNULL(block_price,0) * 1000 + DATE_DIFF( IFNULL(block_time, ''), NOW())
  , DATE_DIFF( IFNULL(last_time, ''), NOW())
)



Применение функции DATE_DIFF() -- советую уточнить в справочнике. И Если она возвращает "что-то не то", то соответственно посмотреть как результат преобразовать к количеству дней, часов или чего ещё, что можно использовать как целое число в разумном диапазоне. Стоимость надо умножать на заведомо большее число, но тоже в разумных пределах...

Можно поступить наоборот: вместо вычитания дат в формате datetime, преобразовать даты/время в timestamp - они хранятся как числа, с ними должно быть проще.
...
Рейтинг: 0 / 0
Запрос MYSQL
    #38398073
Arhat109
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Arhat109, очепятка:

в предложении "В примере я оговорил это как наибольшее значение поля last_time = 1000"
, читать как block_time=1000

:)
...
Рейтинг: 0 / 0
Запрос MYSQL
    #38398088
igurman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Arhat109промах по клаве, продолжение:

и по уменьшению block_time. Если block_time тоже дата/время, то применяем тот же финт с датой: DATE_DIFF(block_time, NOW()).

Чтобы вес времени размещения не влиял на сортировку по стоимости, стоимость надо "сдвинуть" в бОльший диапазон значений... то есть умножить на число заведомо большее наибольшего значения этой разницы "в днях". В примере я оговорил это как наибольшее значение поля last_time = 1000.

Если поля могут принимать NULL, то прямое обращение к ним заменяем на функцию IFNULL(поле, 0)

Итого получим:
Код: sql
1.
2.
3.
4.
ORDER BY IF( IFNULL(block_price,0) <> 0
  , IFNULL(block_price,0) * 1000 + DATE_DIFF( IFNULL(block_time, ''), NOW())
  , DATE_DIFF( IFNULL(last_time, ''), NOW())
)



Применение функции DATE_DIFF() -- советую уточнить в справочнике. И Если она возвращает "что-то не то", то соответственно посмотреть как результат преобразовать к количеству дней, часов или чего ещё, что можно использовать как целое число в разумном диапазоне. Стоимость надо умножать на заведомо большее число, но тоже в разумных пределах...

Можно поступить наоборот: вместо вычитания дат в формате datetime, преобразовать даты/время в timestamp - они хранятся как числа, с ними должно быть проще.

Возможно Вы условия прочитали не верно .. зависимостей как таковых нет .. есть сортировка ... датовый тип не используется там везде int(13) ...

Алгоритм =

If Есть цена больше для платных > 0 ? ставим вначало и их Сортировать по возрастанию

+
Есть платники ? для этой выборки ? = Дата размещения платника сортируется по убыванию

+ сюда же
Остальные объявки сортируются по дате добавления = редактирования

Как то так
...
Рейтинг: 0 / 0
Запрос MYSQL
    #38398095
Arhat109
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
igurman,

Упс. Первое условие: "Есть цена больше для платных > 0", то есть "Если платник И его цена >0" - нет? Тогда приведите DDL таблицы и как проверяется первая часть условия2: "Есть платник".

Я вас понял так: Если block_price > 0 , то это платник и значение - это стоимость объявки. Чем она больше, тем раньше надо выводить - то есть сортируем по УБЫВАНИЮ... а вы пишете по возрастанию...

Если всё в целых числах - приведите диапазоны допустимых (имеющихся в БД) значений:

SELECT MIN(block_price), MAX(block_price), MIN(block_time), MAX(block_time) FROM ...
...
Рейтинг: 0 / 0
Запрос MYSQL
    #38398098
Arhat109
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Arhat109,

заодно напишите могут ли значения и какие быть равными NULL.
...
Рейтинг: 0 / 0
Запрос MYSQL
    #38398113
igurman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Arhat109,

Да , сорри колизия мозга ) по убыванию =

block_price = стоимость платного размещения объявления - чем больше тем выше должно быть ( если нет = 0 )

по факту

block_price DESC,
block_time DESC,
last_time

Если есть платные то их сверху по убыванию цены за сутки,
если есть в сутках одна цена то по убыванию по block_time,
дальше простые объявления по убыванию last_time

все поля int(13) в индексе
...
Рейтинг: 0 / 0
Запрос MYSQL
    #38398126
Arhat109
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
igurman,

1. То есть полей с незаполненным значением (DEFAULT NULL) - нет, так?
2. по убыванию цены ЗА СУТКИ - упс. Про сутки не было ни слова или я - пропустил? Что такое "за сутки" и где оно в ваших полях?
3. А теперь давайте уточним (без за сутки), есть такие данные:

block_price block_time
100 10
100 8
90 9
70 11

порядок вывода? Они все "платники", так? Стало быть выводим по убыванию block_price и только при совпадении, ранжируем по block_time (как и показано и поле last_time тут ни при чем): тогда ваш ORDER BY block_price DESC, block_time DESC -- "то что доктор прописал". Или эту часть надо "как-то по-другому"?
...
Рейтинг: 0 / 0
17 сообщений из 17, страница 1 из 1
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Запрос MYSQL
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]