python не большая помощь

Тема в разделе "Perl, Python, Ruby", создана пользователем dr-ef, 21 сен 2014.

  1. dr-ef

    dr-ef Создатель

    Регистр.:
    2 июл 2011
    Сообщения:
    31
    Симпатии:
    0
    Кто может помочь немного подкоректировать...Надо поправить такой код

    c.execute("(SELECT DISTINCT address FROM "+table+" WHERE game = 'cs16' AND type = 1 AND date_endtop > unix_timestamp(now()) ORDER BY date_end DESC) UNION (SELECT DISTINCT address FROM "+table+" WHERE game = 'cs16' AND type = 1 AND date_endvip > unix_timestamp(now()) ORDER BY date_end DESC) UNION (SELECT DISTINCT address FROM "+table+" WHERE game = 'cs16' AND boost = 1 AND rounds >= 1 ORDER BY date_addboost DESC)")

    Что надо доделать , к date_endtop добавить num_top. В колонке num_top идут значения 1,2,3,4,5 и т.д. надо чтобы выводило в том порядке в каком указано в num_top.
    Надеюсь смог обьяснить)
     
  2. kanaps

    kanaps Создатель

    Регистр.:
    19 ноя 2013
    Сообщения:
    17
    Симпатии:
    9
    думаю нужно пост в другую тему. тут больше по sql, а не питону.
    а если нужно сортировать в питоне то я обычно лупы делаю... если конечно не планируется тысячи записей для тясячей юзеров сортировать... а если нужно, то можно вариацию кэширования результата можно использовать..
     
  3. unpunk

    unpunk Писатель

    Регистр.:
    25 янв 2015
    Сообщения:
    5
    Симпатии:
    2
    Переформатировал тело запроса для наглядности:
    (SELECT DISTINCT address FROM "+table+" WHERE game = 'cs16' AND type = 1 AND date_endtop > unix_timestamp(now()) ORDER BY date_end DESC)
    UNION
    (SELECT DISTINCT address FROM "+table+" WHERE game = 'cs16' AND type = 1 AND date_endvip > unix_timestamp(now()) ORDER BY date_end DESC)
    UNION
    (SELECT DISTINCT address FROM "+table+" WHERE game = 'cs16' AND boost = 1 AND rounds >= 1 ORDER BY date_addboost DESC)

    Итак, у нас выводится поле address по 3 различным фильтрам, date_endtop присутствует только в первом запросе.
    После объединения внутренние сортировки (по date_end и date_addboost), скорее всего, слетят. Если ими можно пренебречь, то можно переписать запрос, например, вот так:

    (SELECT DISTINCT address FROM "+table+" WHERE game = 'cs16' AND type = 1 AND date_endtop > unix_timestamp(now())) UNION
    (SELECT DISTINCT address FROM "+table+" WHERE game = 'cs16' AND type = 1 AND date_endvip > unix_timestamp(now())) UNION
    (SELECT DISTINCT address FROM "+table+" WHERE game = 'cs16' AND boost = 1 AND rounds >= 1)

    Затем так:

    SELECT DISTINCT address FROM "+table+" WHERE game = 'cs16'
    AND (
    (type = 1 AND date_endtop > unix_timestamp(now())) OR
    (
    type = 1 AND date_endvip > unix_timestamp(now())) OR
    (boost = 1 AND rounds >= 1)
    )

    В оставшемся запросе теперь можно добавить упорядочивание по колонке num_top:

    SELECT DISTINCT address FROM "+table+" WHERE game = 'cs16'
    AND (
    (type = 1 AND date_endtop > unix_timestamp(now())) OR
    (
    type = 1 AND date_endvip > unix_timestamp(now())) OR
    (boost = 1 AND rounds >= 1)
    )
    ORDER BY num_top

    Это приблизительно похоже на то, что требуется в задаче?