За последние 24 часа нас посетили 20416 программистов и 1008 роботов. Сейчас ищут 397 программистов ...

Как лучше сделать выборку

Тема в разделе "MySQL", создана пользователем logovo, 17 апр 2019.

  1. logovo

    logovo Активный пользователь

    С нами с:
    18 янв 2017
    Сообщения:
    18
    Симпатии:
    2
    Подскажите, плиз. Mysql владею в объеме шаблонных выборок, что-то сложнее идёт трудно.
    Условия задачи. Новостной сайт. В таблице каждой новости "news" есть следующие значимые столбцы автоинкремент "id" (int), поле количества просмотров новости "viewcount" (int) и поле "date" (datetime). Для формирования на сайте раздела "самые интересные новости" предложен алгоритм, где каждая новость получает 1 балл за просмотр и теряет 2 балла за каждый прошедший с момента её опубликования день. Возможно ли сделать выборку с сортировкой по количеству баллов исходя из данного алгоритма?
    Просто по дате вывести 5 последних новостей я могу.
    PHP:
    1. $result = mysql_query("SELECT * FROM news WHERE id<>'$id' ORDER BY date DESC LIMIT 5");
    (кусок кода WHERE id<>'$id' нужен, чтобы из этой колонки исключалась текущая новость).
    А как модернизировать выборку, чтобы она отвечала условиям вышеописанного алгоритма?
     
  2. ADSoft

    ADSoft Старожил

    С нами с:
    12 мар 2007
    Сообщения:
    3.822
    Симпатии:
    736
    Адрес:
    Татарстан
    и что - реально "<>" работает? вроде всю жизни неравенство было как "!="
    а так - что-то типа
    Код (Text):
    1. ORDER BY (`viewcount`-DATEDIFF(NOW(), `date`)*2) ASC
    только тип viewcount должен быть signed (со знаком),
    либо приводить его к такому через CAST()
     
    #2 ADSoft, 17 апр 2019
    Последнее редактирование: 17 апр 2019
    logovo нравится это.
  3. Valick

    Valick Активный пользователь

    С нами с:
    12 авг 2018
    Сообщения:
    1.911
    Симпатии:
    328
    для РНР типично != , для MySQL <>
     
  4. machetero

    machetero Активный пользователь

    С нами с:
    25 окт 2014
    Сообщения:
    499
    Симпатии:
    21
    Вам надо ORDER BY viewcount, date
     
  5. logovo

    logovo Активный пользователь

    С нами с:
    18 янв 2017
    Сообщения:
    18
    Симпатии:
    2
    Ни в коем случае, ваш вариант отсортирует по числу просмотров и только при равенстве просмотров - по дате. А мне необходимо, чтобы старая дата постепенно уходила вниз.
     
  6. logovo

    logovo Активный пользователь

    С нами с:
    18 янв 2017
    Сообщения:
    18
    Симпатии:
    2
    Спасибо огромное за внятный ответ. Вроде заработало в первом приближении вот так. Только всё-таки DESC. Сортировка от большего к меньшему, мы ищем популярные новости, а не отстойные. :)

    Код (Text):
    1. $result = mysql_query("SELECT * FROM news WHERE id<>'$id' ORDER BY (CAST(viewcount AS SIGNED) - DATEDIFF(NOW(), date)*2) DESC LIMIT 5");
     
    #6 logovo, 17 апр 2019
    Последнее редактирование: 17 апр 2019