За последние 24 часа нас посетил 18401 программист и 1605 роботов. Сейчас ищут 953 программиста ...

Рандомное добавление

Тема в разделе "PHP для новичков", создана пользователем samaritynka, 29 фев 2012.

  1. samaritynka

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

    С нами с:
    17 дек 2011
    Сообщения:
    30
    Симпатии:
    0
    нужно сделать рандомное добавление ид пользователя в БД

    id юзера = USERID
    есть база данных
    id, user1, user2, user3, user4, user5, user6

    будет что-то типа турнира, где играют 3 на 3

    пользователь будет нажимать кнопку ВСТУПИТЬ
    и его id будет добавляться в одну из ячеек user1, user2, user3, user4, user5, user6
    только USERID должно добавляться в рандомную ячейку
     
  2. AndreJM

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

    С нами с:
    25 янв 2012
    Сообщения:
    522
    Симпатии:
    0
    мне кажется вам надо разобраться с архитектурой данных, скажем сконструировать так, чтобы вы не задумывалась в каком порядке и что добавлять
    Ну например:

    Имеем таблицу ТУРНИРЫ:
    Код (Text):
    1.  
    2. CREATE TABLE IF NOT EXISTS `test` (
    3.   `tournament` int(11) NOT NULL,
    4.   `userid` int(11) NOT NULL
    5. ) ENGINE=MyISAM
    Таким образом, вы будете добавлять в таблицу строки где каждая строка состоит из: tournament (номер проходящего турнира) и uderid (участник), а вот уже потом делать выборку по номеру турнира и организовывать рандомную выдачу. (ЗЫ: соответсвенно можно добавить поле в таблицу для первичного присвоения порядка, чтобы в последствии сохранить порядок установленный после первой выборки)

    Вообще вариантов много, подумайте.
     
  3. samaritynka

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

    С нами с:
    17 дек 2011
    Сообщения:
    30
    Симпатии:
    0
    возможно не правильно объяснила
    создается турнир
    заявку в этом турнире смогут принять 6 человек
    эти 6 человек будут разделенны на 2 команды
    мне нужно сделать так чтобы их делило на команды рандомом, а не по порядку как они добавлялись
     
  4. Крыс

    Крыс Активный пользователь

    С нами с:
    3 фев 2012
    Сообщения:
    449
    Симпатии:
    0
    нет, вы просто не поняли, что вам посоветовал AndreJM
    он написал всё верно
     
  5. AndreJM

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

    С нами с:
    25 янв 2012
    Сообщения:
    522
    Симпатии:
    0
    =)
    Перечитайте мой пост.

    Если вы все же настаиваете на собственной модели, то я рекомендую на момент регистрации на турнир сохранять заявки в другом месте и как только все участники заявили свое желание участвовать в турнире, создавать запись в БД с уже сшафленными участниками.
    Всё же подумайте над архитектурой. Мне не видно то, что доступно Вам. Может я и предложил бы иную схему если проанализировал какие есть возможности для выбора подхода к проектированию задачи.
     
  6. samaritynka

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

    С нами с:
    17 дек 2011
    Сообщения:
    30
    Симпатии:
    0
    ааа поняла вроде
    юзер нажимает ВСТУПИТЬ и создается запись с его юзер ид и с ид турнира в который он вступил? так?
     
  7. AndreJM

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

    С нами с:
    25 янв 2012
    Сообщения:
    522
    Симпатии:
    0
    Все верно)
     
  8. samaritynka

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

    С нами с:
    17 дек 2011
    Сообщения:
    30
    Симпатии:
    0
    допустим я сделала так, как вы предложили
    в турнире будет участвовать 6 человек
    возможно мне нужно будет выводить кто в какой команде будет играть до того момента как соберется 6 человек
    есть например 4 человека которые приняли заявку, возможно ли будет сделать чтобы показывало кто из них и где будет играть
    и чтобы их не перемешивало в дальнейшем больше

    и если можно, то хотябы принцип по которому все это делать
     
  9. AndreJM

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

    С нами с:
    25 янв 2012
    Сообщения:
    522
    Симпатии:
    0
    Наверное в вашем случае будет более удобнее сделать так:
    Код (Text):
    1.  
    2. CREATE TABLE IF NOT EXISTS `test` (
    3.   `tournament` int(11) NOT NULL,
    4.   `userid` varchar(11) NOT NULL,
    5.   `level` float NOT NULL
    6. ) ENGINE=MyISAM
    а теперь самое забавное:
    Код (Text):
    1. INSERT INTO test VALUES( '1', '1', RAND() )
    ЗЫ: по поводу float вам решать.

    Ну и что мы имеем?
    да банальный

    Код (Text):
    1. SELECT * FROM test WHERE tournament='1' ORDER BY level ASC
    Если важно сохранить предыдущую последовательность участников то .... м... дайте подумать.. сюда отвечу как надумаю )

    Добавлено спустя 1 минут 0 секунды:
    Внесите ясность. Если мы пытаемся сохранять предыдущую позицию уже зарегистрированных на турнир, то RAND() теряет свой смысл, ибо в данном случае задача становиться из ряда "Кто первый зарегался тот так и будет играть".
     
  10. samaritynka

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

    С нами с:
    17 дек 2011
    Сообщения:
    30
    Симпатии:
    0
    да все именно так
    зарегился и тебя кинуло за команду 1 или за команду 2
    и по окончанию набора команд ты так и остаешься за свою команду.
     
  11. AndreJM

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

    С нами с:
    25 янв 2012
    Сообщения:
    522
    Симпатии:
    0
    То есть вам нужно генерить случайный идентификатор команды который, как я понимаю, меньше кол-ва участников? То есть важный момент это не каким образом зарегистрировались участники турнира, а в какую команду они попали.. все верно?
     
  12. samaritynka

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

    С нами с:
    17 дек 2011
    Сообщения:
    30
    Симпатии:
    0
    участники турнира регистрируются отдельно
    важно в какой команде они будут играть, чтобы это был случайный выбор
     
  13. sobachnik

    sobachnik Старожил

    С нами с:
    20 апр 2007
    Сообщения:
    3.380
    Симпатии:
    13
    Адрес:
    Дмитров, МО
    Я бы организовал базу данных примерно так:

    Таблица "туриниры":
    ИД турнира, названите турнира (если надо), дата турнира.

    Таблица "команды":
    ИД команды, ИД турнира, Название команды

    Таблица "участники":
    ИД участника, ИД пользователя системы (user_id), ИД команды

    Выборка всех участников для выбранного турнира в таком случае:
    Код (Text):
    1. SELECT `участники`.`user_id`, `участники`.`ИД команды`, `команды`.`Название команды`, `Турниры`.`Название Турнира`, `Турниры`.`Дата турнира` FROM `Турниры` INNER JOIN `Команды` ON (`Турниры`.`ИД турнира` = `Команды`.`ИД турнира`) INNER JOIN `Участники` ON (`Участники`.`ИД команды` = `Команды`.`ИД команды`) WHERE `Турниры`.`ИД турнира` = запрошенный_ИД_турнира
     
  14. samaritynka

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

    С нами с:
    17 дек 2011
    Сообщения:
    30
    Симпатии:
    0
    подскажите как составить запрос на добавление

    есть таблица "турниры"
    в ней поля: "ид","название турнира", "админ турнира''
    значение полей: ид=автоинкремент, название турнира=название 50 символов, админ турнира=ид юзера который добавил турнир

    и есть таблица "участники"
    там поля: "ид турнира", "ид участника"

    пользователь создает турнир, должно создаться две записи одна в таблице "турниры" другая в таблице "участники"


    в таблице "турниры":
    "1","название турнира", "1"

    в таблице "участники":
    "1", "1"

    все вроде как просто, но не могу понять как получить ид турнира для создания записи в таблице "участники"
    (конечно могу получить ид, но мне кажется мой метод будет очень не простым, сначало сделать INSERT, потом SELECT, а потом опять INSERT ;) )
     
  15. sobachnik

    sobachnik Старожил

    С нами с:
    20 апр 2007
    Сообщения:
    3.380
    Симпатии:
    13
    Адрес:
    Дмитров, МО
  16. AndreJM

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

    С нами с:
    25 янв 2012
    Сообщения:
    522
    Симпатии:
    0
    Код (Text):
    1.  
    2. INSERT INTO tournament VALUES(NULL, название_турнира, админ);
    3. INSERT INTO members VALUES(LAST_INSERT_ID(),ид_участника);
    NULL - для автоинкрементации ID
    тут MySQL сам подставит ид из предыдущего запроса. Все это делается одним запросом из php

    Зы: некоторую логику я все же рекомендовал бы вам перекладывать на плечи MySQL, в частности на SQL запросы. Ну нет смысла использовать mysql_insert_id (имхо)
     
  17. samaritynka

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

    С нами с:
    17 дек 2011
    Сообщения:
    30
    Симпатии:
    0
    c LAST_INSERT_ID() не получилось, выдает ошибку сервера
    а вот с mysql_insert_id() все супер
    спасибо
     
  18. AndreJM

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

    С нами с:
    25 янв 2012
    Сообщения:
    522
    Симпатии:
    0
    Не верю! (с)

    =)
     
  19. samaritynka

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

    С нами с:
    17 дек 2011
    Сообщения:
    30
    Симпатии:
    0
    mysql_query ("INSERT INTO `tournament` VALUES ('NULL', '".$title."', '".USERID."')");
    mysql_query ("INSERT INTO `members` VALUES ('".LAST_INSERT_ID()."', '".USERID."')");

    ошибка 500 выскакивает
     
  20. AndreJM

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

    С нами с:
    25 янв 2012
    Сообщения:
    522
    Симпатии:
    0
    LAST_INSERT_ID - это функция самого MySQL, а не php )

    Код (Text):
    1.  
    2. mysql_query ("INSERT INTO `members` VALUES (LAST_INSERT_ID(),  '".USERID."')");
    Зы: у вас ид юзера ввиде константы?
     
  21. samaritynka

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

    С нами с:
    17 дек 2011
    Сообщения:
    30
    Симпатии:
    0
    да ввиде константы? это плохо? ж)


    и еще вопросик:
    после завершения турнира каждый пользователь должен оценить противника
    тоесть получается от одного юзера 5 оценок
    пока он не оценит, играть в другом турнире он не сможет
    вопрос: как устроить базу данных в таком случае?

    как я думаю: создать таблицу `point`
    в ней `ид_того_кто_оценивал`, `кол-во баллов`, `ид_того_кто_оценивает`