|
|
|
Запрос MYSQL
|
|||
|---|---|---|---|
|
#18+
Приветствую форумчан ! Выходит проблема с запросом : 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 .. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.09.2013, 16:32:38 |
|
||
|
Запрос MYSQL
|
|||
|---|---|---|---|
|
#18+
igurmanпервой идет ORDER by block_price ... хотя они по дефолту нулевые"нулевые" - это NULL или 0 ? Приведите пример исходных данных и желаемого результата. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.09.2013, 16:46:02 |
|
||
|
Запрос MYSQL
|
|||
|---|---|---|---|
|
#18+
igurman, в предположении, что block_price и block_time -- целые положительные числа (если нет, то можно туда преобразовать или изменить соответственно) Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.09.2013, 16:52:07 |
|
||
|
Запрос MYSQL
|
|||
|---|---|---|---|
|
#18+
Arhat109, в чистом виде работать не будет, но как идея - пойдет. Там надо разрулить диапазоны итоговой функции и значений поля last_time. Последние должны быть меньше пенрвых "в целом". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.09.2013, 16:54:00 |
|
||
|
Запрос MYSQL
|
|||
|---|---|---|---|
|
#18+
block_price block_time = int (13) по умолчанию None ( сейчас все = 0 ) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.09.2013, 16:54:52 |
|
||
|
Запрос MYSQL
|
|||
|---|---|---|---|
|
#18+
Arhat109igurman, в предположении, что block_price и block_time -- целые положительные числа (если нет, то можно туда преобразовать или изменить соответственно) Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. Конечно пойдет если котлеты умножить на мухи ))) явно решение не в это русле )) Но спасибо ) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.09.2013, 17:06:40 |
|
||
|
Запрос MYSQL
|
|||
|---|---|---|---|
|
#18+
igurman, вам кушать или штоб работало? Суть идеи, как Вы и хотели: если платник, то сортируем по нужному нам правилу, иначе - все остальные по последнему изменению в порядке убывания. Отмасштабируйте самостоятельно на ваших фактах. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.09.2013, 17:14:41 |
|
||
|
Запрос MYSQL
|
|||
|---|---|---|---|
|
#18+
Arhat109igurman, вам кушать или штоб работало? Уважаемый Arhat109 ну конечно же, чтобы работало нужно )) я насколько понимаю это условие IF = ВЗАИМОИСКЛЮЧАЕМОЕ, а мне в данном случае нужно последовательно получить с условиями. Ума нет чтобы понять как сделать )) сори .. был бы премного благодарен за более развернутый рабочий ответ с как минимум тремя не взаимоисключающими условиями а дополняющими... Возможна благодарность за работу и восстановление колорий в WMR в частности 8-) ! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.09.2013, 17:32:04 |
|
||
|
Запрос MYSQL
|
|||
|---|---|---|---|
|
#18+
igurman, Код: sql 1. 2. 3. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.09.2013, 18:05:02 |
|
||
|
Запрос MYSQL
|
|||
|---|---|---|---|
|
#18+
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 И по уменьшению ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.09.2013, 19:09:18 |
|
||
|
Запрос MYSQL
|
|||
|---|---|---|---|
|
#18+
промах по клаве, продолжение: и по уменьшению block_time. Если block_time тоже дата/время, то применяем тот же финт с датой: DATE_DIFF(block_time, NOW()). Чтобы вес времени размещения не влиял на сортировку по стоимости, стоимость надо "сдвинуть" в бОльший диапазон значений... то есть умножить на число заведомо большее наибольшего значения этой разницы "в днях". В примере я оговорил это как наибольшее значение поля last_time = 1000. Если поля могут принимать NULL, то прямое обращение к ним заменяем на функцию IFNULL(поле, 0) Итого получим: Код: sql 1. 2. 3. 4. Применение функции DATE_DIFF() -- советую уточнить в справочнике. И Если она возвращает "что-то не то", то соответственно посмотреть как результат преобразовать к количеству дней, часов или чего ещё, что можно использовать как целое число в разумном диапазоне. Стоимость надо умножать на заведомо большее число, но тоже в разумных пределах... Можно поступить наоборот: вместо вычитания дат в формате datetime, преобразовать даты/время в timestamp - они хранятся как числа, с ними должно быть проще. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.09.2013, 19:24:57 |
|
||
|
Запрос MYSQL
|
|||
|---|---|---|---|
|
#18+
Arhat109, очепятка: в предложении "В примере я оговорил это как наибольшее значение поля last_time = 1000" , читать как block_time=1000 :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.09.2013, 19:30:05 |
|
||
|
Запрос MYSQL
|
|||
|---|---|---|---|
|
#18+
Arhat109промах по клаве, продолжение: и по уменьшению block_time. Если block_time тоже дата/время, то применяем тот же финт с датой: DATE_DIFF(block_time, NOW()). Чтобы вес времени размещения не влиял на сортировку по стоимости, стоимость надо "сдвинуть" в бОльший диапазон значений... то есть умножить на число заведомо большее наибольшего значения этой разницы "в днях". В примере я оговорил это как наибольшее значение поля last_time = 1000. Если поля могут принимать NULL, то прямое обращение к ним заменяем на функцию IFNULL(поле, 0) Итого получим: Код: sql 1. 2. 3. 4. Применение функции DATE_DIFF() -- советую уточнить в справочнике. И Если она возвращает "что-то не то", то соответственно посмотреть как результат преобразовать к количеству дней, часов или чего ещё, что можно использовать как целое число в разумном диапазоне. Стоимость надо умножать на заведомо большее число, но тоже в разумных пределах... Можно поступить наоборот: вместо вычитания дат в формате datetime, преобразовать даты/время в timestamp - они хранятся как числа, с ними должно быть проще. Возможно Вы условия прочитали не верно .. зависимостей как таковых нет .. есть сортировка ... датовый тип не используется там везде int(13) ... Алгоритм = If Есть цена больше для платных > 0 ? ставим вначало и их Сортировать по возрастанию + Есть платники ? для этой выборки ? = Дата размещения платника сортируется по убыванию + сюда же Остальные объявки сортируются по дате добавления = редактирования Как то так ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.09.2013, 19:53:42 |
|
||
|
Запрос MYSQL
|
|||
|---|---|---|---|
|
#18+
igurman, Упс. Первое условие: "Есть цена больше для платных > 0", то есть "Если платник И его цена >0" - нет? Тогда приведите DDL таблицы и как проверяется первая часть условия2: "Есть платник". Я вас понял так: Если block_price > 0 , то это платник и значение - это стоимость объявки. Чем она больше, тем раньше надо выводить - то есть сортируем по УБЫВАНИЮ... а вы пишете по возрастанию... Если всё в целых числах - приведите диапазоны допустимых (имеющихся в БД) значений: SELECT MIN(block_price), MAX(block_price), MIN(block_time), MAX(block_time) FROM ... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.09.2013, 20:01:12 |
|
||
|
Запрос MYSQL
|
|||
|---|---|---|---|
|
#18+
Arhat109, заодно напишите могут ли значения и какие быть равными NULL. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.09.2013, 20:02:57 |
|
||
|
Запрос MYSQL
|
|||
|---|---|---|---|
|
#18+
Arhat109, Да , сорри колизия мозга ) по убыванию = block_price = стоимость платного размещения объявления - чем больше тем выше должно быть ( если нет = 0 ) по факту block_price DESC, block_time DESC, last_time Если есть платные то их сверху по убыванию цены за сутки, если есть в сутках одна цена то по убыванию по block_time, дальше простые объявления по убыванию last_time все поля int(13) в индексе ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.09.2013, 20:20:26 |
|
||
|
Запрос MYSQL
|
|||
|---|---|---|---|
|
#18+
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 -- "то что доктор прописал". Или эту часть надо "как-то по-другому"? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.09.2013, 20:48:47 |
|
||
|
|

start [/forum/topic.php?fid=47&fpage=208&tid=1836041]: |
0ms |
get settings: |
5ms |
get forum list: |
11ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
21ms |
get topic data: |
7ms |
get forum data: |
2ms |
get page messages: |
33ms |
get tp. blocked users: |
1ms |
| others: | 196ms |
| total: | 280ms |

| 0 / 0 |
