За последние 24 часа нас посетили 56678 программистов и 1682 робота. Сейчас ищут 1228 программистов ...

сервис "поднять анкету" своими руками)

Тема в разделе "Прочие вопросы по PHP", создана пользователем serj011, 2 окт 2012.

  1. serj011

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

    С нами с:
    18 апр 2010
    Сообщения:
    279
    Симпатии:
    0
    На многих сайтах знакомств есть такой сервис "поднять анкету"... Не могу сообразить как логически и правильно его сделать. У меня есть таблица anketa с пользователями, у каждого есть id, который трогать (обновлять) для этой цели нельзя... я создал дополнительное поле id_up, который планировал обновлять при поднятии анкеты. (т.е. находить самое большое значение, прибавлять 1), а потом в резулататах поиска ORDER BY id_up... как то так. соответственно при регистрации новой анкеты такая же процедура.

    В этом случае не знаю как тогда вывести на каком месте находится конкретная анкета!?

    Кто что подскажет?
     
  2. Gold Dragon

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

    С нами с:
    30 сен 2012
    Сообщения:
    306
    Симпатии:
    2
    Адрес:
    Тамбов
    а не проще просто менять дату? И хронология и "конкретное место"
     
  3. serj011

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

    С нами с:
    18 апр 2010
    Сообщения:
    279
    Симпатии:
    0
    по моему нет... или я просто не допонимаю как это)
     
  4. Gold Dragon

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

    С нами с:
    30 сен 2012
    Сообщения:
    306
    Симпатии:
    2
    Адрес:
    Тамбов
    у тебя есть дата регистрации анкеты и "дата поднятия"
    При выводе сортируй по дате поднятия. Номер по порядку в запросе и будет "на каком месте". Нажимаешь на "поднять" и "дата поднятия" становится текущей. Дате формируй time()

    Или тебе нужно поднять на "чуть-чуть", т.е. не выше одной, но не ниже второй?
     
  5. serj011

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

    С нами с:
    18 апр 2010
    Сообщения:
    279
    Симпатии:
    0
    Теперь понял, в принципе почти такая же система как я писал изначально... чуть проще.

    Gold Dragon подскажи как вытащить из запроса номер по порядку?
     
  6. Gold Dragon

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

    С нами с:
    30 сен 2012
    Сообщения:
    306
    Симпатии:
    2
    Адрес:
    Тамбов
    ну ты же получаешь список отсортированный по "дате поднятия", и будешь получать в массив, а значит при обработке массива и сможешь получать номер по порядку.
     
  7. serj011

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

    С нами с:
    18 апр 2010
    Сообщения:
    279
    Симпатии:
    0
    Gold Dragon, в том то и загвоздка у меня... это если выводить в цикле, можно пронумеровать... а мне нужно показать пользователю на каком месте его КОНКРЕТНАЯ анкета!?
     
  8. Gold Dragon

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

    С нами с:
    30 сен 2012
    Сообщения:
    306
    Симпатии:
    2
    Адрес:
    Тамбов
    ну как вариант: получить "дату поднятия" анкеты конкретного пользователя. Потом получить сколько записей у которых "дата поднятия" (не думаю что попадутся одинаковые time(), а если и так, то это очень маленький процент) меньше или ранво "даты поднятия" пользователя. Вот это число и будет "местом"

    Добавлено спустя 40 секунд:
    два запроса конечно делать, но при правильном построении индексов будет быстро, да и достаточно просто

    Добавлено спустя 5 минут 20 секунд:
    ps
    вернее больше и равно :)
     
  9. serj011

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

    С нами с:
    18 апр 2010
    Сообщения:
    279
    Симпатии:
    0
    можно попробовать, хотя я думаю что должны быть варианты полегче...
    что такое индексы, как их правильно построить?)
     
  10. Gold Dragon

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

    С нами с:
    30 сен 2012
    Сообщения:
    306
    Симпатии:
    2
    Адрес:
    Тамбов
    Вот маленький примерчик накидал

    Допустим есть таблица
    Код (Text):
    1. CREATE TABLE IF NOT EXISTS `qqq` (
    2.   `id` int(11) NOT NULL AUTO_INCREMENT,
    3.   `name` varchar(30) NOT NULL DEFAULT '',
    4.   `data_reg` int(10) NOT NULL DEFAULT '0',
    5.   `data_up` int(10) NOT NULL DEFAULT '0',
    6.   PRIMARY KEY (`id`),
    7.   KEY `data_reg` (`data_reg`)
    8. ) ENGINE=MyISAM AUTO_INCREMENT=9 DEFAULT CHARSET=utf8;
    Забиваем тестовыми данными
    Код (Text):
    1. INSERT INTO `qqq` (`id`, `name`, `data_reg`, `data_up`) VALUES
    2.     (1, 'Кто-то 1', 1349244791, 1349244791),
    3.     (2, 'Кто-то 2', 1349244792, 1349244792),
    4.     (3, 'Кто-то 3', 1349244793, 1349244795),
    5.     (4, 'Кто-то 4', 1349244794, 1349244794),
    6.     (5, 'Кто-то 5', 1349244795, 1349244795),
    7.     (6, 'Кто-то 6', 1349244796, 1349244796),
    8.     (7, 'Кто-то 7', 1349244797, 1349244797),
    9.     (8, 'Кто-то 8', 1349244798, 1349244793);
    И видим что запись ID=8 немного "подняли"

    И теперь два маленьких, но очень простых и очень быстрых запроса.
    Получаем "дату поднятия"
    Код (Text):
    1. SELECT `data_reg` FROM `qqq` WHERE `id` = 8;
    Получаем "место под солнцем"
    Код (Text):
    1. SELECT COUNT(*) FROM `qqq` WHERE `data_up` >= 1349244793
    Результат: 6

    Куда ещё легче и проще :)

    А вот по индексам это не два предложения.. Нужно почитать что-то более объёмное и серьёзное. Но чтобы представить что это такое на самом простом уровне, вот нашёл маленькую статейку, но достаточно понятно написанную
    http://www.warayg.narod.ru/context/bd/MySQL/4.htm
     
  11. serj011

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

    С нами с:
    18 апр 2010
    Сообщения:
    279
    Симпатии:
    0
    Gold Dragon, спасибо за помошь и за пример. про индексы обязательно почитаю)
     
  12. sobachnik

    sobachnik Старожил

    С нами с:
    20 апр 2007
    Сообщения:
    3.380
    Симпатии:
    13
    Адрес:
    Дмитров, МО
    microtime(true) - с десятитысячными долями секунд
     
  13. Gold Dragon

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

    С нами с:
    30 сен 2012
    Сообщения:
    306
    Симпатии:
    2
    Адрес:
    Тамбов
    ну это через чур :) Так не бывает... и даже если получится такое что 10 человек одновременно нажмут, то получатся что они все вместе на одном месте. Т.е. каждый из 10 человек или на первом месте или каждый из них на 10-м )))
     
  14. serj011

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

    С нами с:
    18 апр 2010
    Сообщения:
    279
    Симпатии:
    0
    у меня же не одноклассники в конце концов, мне пойдет и time )))))