За последние 24 часа нас посетили 22412 программистов и 1025 роботов. Сейчас ищут 679 программистов ...

Сложная таблица

Тема в разделе "PHP и базы данных", создана пользователем Andrey5555, 4 янв 2010.

  1. Andrey5555

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

    С нами с:
    29 ноя 2007
    Сообщения:
    486
    Симпатии:
    0
    Адрес:
    Киев
    Нужна помощь..

    Есть таблица пользователей. Есть таблица заданий.
    Каждый пользователь должен выполнить все задания.

    Вопрос: как отмечать выполнение заданий для каждого отдельного пользователя?

    Создавать в таблице юзеров для каждого задания столбик и там отмечать - глупо, да и запросов куча...

    Посоветуйте как реализовать..
     
  2. Simpliest

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

    С нами с:
    24 сен 2009
    Сообщения:
    4.511
    Симпатии:
    2
    Адрес:
    Донецк
    третья таблица

    user_id, task_id, complete, date_start, date_end и т.д.
     
  3. Andrey5555

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

    С нами с:
    29 ноя 2007
    Сообщения:
    486
    Симпатии:
    0
    Адрес:
    Киев
    Вариант) Спасиб..
    А может есть какой то более простой?)
     
  4. Simpliest

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

    С нами с:
    24 сен 2009
    Сообщения:
    4.511
    Симпатии:
    2
    Адрес:
    Донецк
    Это самый простой и самый надежный вариант.

    Важно понимать, что в этой таблице ты хранишь только id пользователя и задания.
    Вся информация о пользователе или задании хранится в соответсТвующих таблицах пользователей и заданий.
    А тут ты можешь дополнительно хранить информацию именно о связи. Т.е. завершено/незавершено плюс еще ряд каких-то признаков, т.е. дата начала, дата окончания.
     
  5. Andrey5555

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

    С нами с:
    29 ноя 2007
    Сообщения:
    486
    Симпатии:
    0
    Адрес:
    Киев
    А не сильно много записей будет в таблице?

    И юзеру выводятся только неполненные задания - тоесть это надо будет пробивать таблицу из N записей выполнено ли каждое задание. Потом обращатся к таблице с заданиями..

    Может что то другое можно предложить?
     
  6. Simpliest

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

    С нами с:
    24 сен 2009
    Сообщения:
    4.511
    Симпатии:
    2
    Адрес:
    Донецк
    1. Используй JOIN
    Все невыполненные задания по пользователю или даже группе пользователей будут получаться 1м запросом.

    2.
    Пока у тебя речь не идет о 100т пользователей с 100т заданий у каждого можешь смело игнорировать число записей в таблице. Главное правильно составляй запросы.

    А когда у тебя появятся такие нагрузки, у тебя уже будет опыт как с ними справлятся.
     
  7. Mr.M.I.T.

    Mr.M.I.T. Старожил

    С нами с:
    28 янв 2008
    Сообщения:
    4.586
    Симпатии:
    1
    Адрес:
    у тебя канфетка?
    можно ещё серелизовать нужные задания из таблицы и кешировать в таблицу с юзверями
     
  8. Andrey5555

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

    С нами с:
    29 ноя 2007
    Сообщения:
    486
    Симпатии:
    0
    Адрес:
    Киев
    Simpliest а можно на примере запрос, а то я с JOIN нуб.. не юзал вообще..

    И еще: как таблицу создавать с user_id, task_id...
    Раз в сутки генерировать новую таблицу со всеми строками?

    Я сильно запутался...
     
  9. Simpliest

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

    С нами с:
    24 сен 2009
    Сообщения:
    4.511
    Симпатии:
    2
    Адрес:
    Донецк
    [sql]SELECT * FROM table1
    JOIN table2 ON table1.field = table2.field
    WHERE table1.field1 IN (1,2,3) OR table2.someotherfield = 1[/sql]
     
  10. Andrey5555

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

    С нами с:
    29 ноя 2007
    Сообщения:
    486
    Симпатии:
    0
    Адрес:
    Киев
    У меня вышло что то такое:

    $session = Validate::ValidateInfo($_SESSION['session'], 50, TRUE);

    $sql = mysql_query("SELECT id FROM users WHERE session = '$session' LIMIT 1");
    $info = mysql_fetch_array($sql);

    $sql = mysql_query("SELECT * FROM users, tasks WHERE users.id=tasks.user_id AND tasks.user_id = $info[0]");

    Пойдет так? Или что то лишнее?
     
  11. Andrey5555

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

    С нами с:
    29 ноя 2007
    Сообщения:
    486
    Симпатии:
    0
    Адрес:
    Киев
    И еще: как таблицу создавать с user_id, task_id...
    Раз в сутки генерировать новую таблицу со всеми заданиями для каждого юзера и обновлять статусы заданий?
     
  12. karakh

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

    С нами с:
    11 дек 2007
    Сообщения:
    1.344
    Симпатии:
    0
    Что у тебя в ТЗ написано? Из всего что сказано выше никакое "раз в сутки" не следует в принципе.
     
  13. Andrey5555

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

    С нами с:
    29 ноя 2007
    Сообщения:
    486
    Симпатии:
    0
    Адрес:
    Киев
    Ну вообщем так: вариант с структурой таблицы от Simpliest подошел.

    Тоесть таблица будет вида - user_id, task_id, status
    И по-умолчанию будет содержать данные: 36, 1, 0; 36, 2, 0; 36, 3, 0; 36, 4, 0; и тп и тд для каждого юзера..
    После выполнения какого то задания status в таблице меняется на 1.
    Пользователь каждое задание может выполнять раз в сутки!!!

    Выходит что мне надо в этой таблице раз в сутки обновлять status на 0 для каждого юзера и задания?

    Правильно или что то не то?)))
     
  14. Volt(220)

    Volt(220) Активный пользователь

    С нами с:
    11 июн 2009
    Сообщения:
    1.640
    Симпатии:
    1
    Вместо status пиши дату, когда последний раз задание было выполнено.
     
  15. DarkElf

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

    С нами с:
    22 окт 2006
    Сообщения:
    1.632
    Симпатии:
    0
    Andrey5555
    именно раз в 24 часа или вариант типа

    10.11.12 23:59:59
    11.11.12 00:00:26

    прокатывает?

    если прокатывает и статистику хранить не надо - то можно в 00:00:00 по cron'у запускать скрипт, который сбрасывает все статусы в 0.
     
  16. Simpliest

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

    С нами с:
    24 сен 2009
    Сообщения:
    4.511
    Симпатии:
    2
    Адрес:
    Донецк
    DarkElf
    Ну вот смысл выдумывать?

    Если самый правильный вариант уже озвучен
     
  17. Andrey5555

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

    С нами с:
    29 ноя 2007
    Сообщения:
    486
    Симпатии:
    0
    Адрес:
    Киев
    DarkElf катит, но вариант с date удобнее.
    Спасибо.