За последние 24 часа нас посетили 59856 программистов и 1770 роботов. Сейчас ищут 839 программистов ...

как можно создать такую таблицу

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

  1. aziz

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

    С нами с:
    1 фев 2006
    Сообщения:
    194
    Симпатии:
    0
    Адрес:
    Ташкент
    Добрый вечер, столкнулся с такой проблемой, быть может кто подскажет как это сделать или посоветует где прочесть. мне не обходимо в базе создать такую таблицу, но что то логика не лезит в голову.
    [​IMG]
     
  2. aziz

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

    С нами с:
    1 фев 2006
    Сообщения:
    194
    Симпатии:
    0
    Адрес:
    Ташкент
    Я предпологаю что здесь нужно объеденить 3 а быть может и 4 таблицы, но как это реализовать в базе, не пойму.
    Вот дамп таблиц
    Код (Text):
    1. CREATE TABLE IF NOT EXISTS `day` (
    2.   `id_d` int(11) NOT NULL AUTO_INCREMENT,
    3.   `day` text NOT NULL,
    4.   PRIMARY KEY (`id_d`)
    5. ) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;
    6.  
    7.  
    8. CREATE TABLE IF NOT EXISTS `fio` (
    9.   `id_u` int(11) NOT NULL AUTO_INCREMENT,
    10.   `name` text NOT NULL,
    11.   PRIMARY KEY (`id_u`)
    12. ) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;
    13.  
    14.  
    15.  
    16. CREATE TABLE IF NOT EXISTS `pred` (
    17.   `id_p` int(11) NOT NULL AUTO_INCREMENT,
    18.   `chas` text NOT NULL,
    19.   PRIMARY KEY (`id_p`)
    20. ) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;

    вот код, как видите получается какаятя чушь. мозги кипят ....
    PHP:
    1. <table width="80%" border="1" cellspacing="0" cellpadding="3">
    2.   <tr>
    3.     <td width="5%"  scope="col">b</td>
    4.     <td scope="col"><table width="80%" border="1" cellspacing="0" cellpadding="3">
    5.       <tr>
    6.         <?php include('config.php'); ?><?
    7. $result = mysql_query("SELECT * FROM `pred` LIMIT 0, 7");
    8. //echo $numOL = mysql_num_rows($result);
    9.        while($row = mysql_fetch_array($result)){
    10.                echo '
    11.                
    12.  
    13.  <td nowrap>
    14.     <a href="test.php?id='.$row['id_p'].'">'.stripslashes($row['chas']).'</a>
    15.  </td>
    16. ';
    17.                  }
    18.  
    19. ?>
    20.         </tr>
    21.     </table></td>
    22.   </tr>
    23.   <tr>
    24.     <td><table bgcolor="#CCCCCC"><?php include('config.php'); ?><?
    25. $result = mysql_query("SELECT * FROM `fio` ");
    26. //echo $numOL = mysql_num_rows($result);
    27.        while($row = mysql_fetch_array($result)){
    28.                echo '
    29.                
    30. <tr>
    31.  <td nowrap>
    32.     <a href="test.php?id='.$row['id_u'].'">'.stripslashes($row['name']).'</a>
    33.  </td>
    34.  
    35. </tr>';
    36.                  }
    37. ;
    38. ?></table></td>
    39.     <td><table bgcolor="#999999"><?php include('config.php'); ?><?
    40. $result = mysql_query("SELECT * FROM `fio` ");
    41. $numOL = mysql_num_rows($result);
    42. $i=1;
    43.        for($i=1; $i<=$numOL; $i++){
    44.                echo '
    45.                
    46. <tr>
    47.  <td>
    48.     проверка
    49.  </td>
    50.  
    51. </tr>';
    52.                  }
    53. ;
    54. ?></table></td>
    55.   </tr>
    56. </table>
     
  3. Goryn

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

    С нами с:
    4 апр 2006
    Сообщения:
    398
    Симпатии:
    0
    Адрес:
    Ярославль
    Таблица в БД судя по всему плоская, а чтоб вывести на экран в нужном виде изучаем HTML
    <table>
    ...............
    </table>
     
  4. aziz

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

    С нами с:
    1 фев 2006
    Сообщения:
    194
    Симпатии:
    0
    Адрес:
    Ташкент
    Наверно я не совсем правильно изложил то что я хочу сделать. Все данные в таблице, динамически подгружаемые из mysql. Мне необходимо сделать что бы параметры из таблицы с цыфрами выводились каждая привязанной к своему дню, фамилии и "час", где также "час", тоесть "первое","второе","третье" также меняютс от зависимости дня недели.
     
  5. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    aziz
    ничерта не понятно. =)

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

    мозги у вас кипят по простой причине (по той же по которой вывести не получается). в предложеной вами структуре бд из трех таблиц я вижу что есть айди и какие-то данные. и? как они связаны между собой? почему данные по этому айди нужно выводить туда-то или сюда-то - ниоткуда не следует. кому пренадлежат или предназначаются данные - не понятно.

    либо заводите таблицу куда пишите кому какой айди раздали, либо пишите связи прямо в те же строки как еще один айди =)

    только надо сначала сформулировать задачу человеческим языком. потом почесать репу, потом подумать нафига это все надо, и уже от этого думать сколько таблиц надо и как их связывать.
     
  6. aziz

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

    С нами с:
    1 фев 2006
    Сообщения:
    194
    Симпатии:
    0
    Адрес:
    Ташкент
    Дело в том что ФИО берется с одной таблицы, день недели с другой, "первое"...."седьмое" с третьей таблицы и меняет место в зависимости от дня недели а заполняющие цыфры с четвёртой. Эти цыфры привязаны к первым трём таблицам. В конце пользователь видит таблицу как на картинке. Вот и не пойму как это реализовать.
     
  7. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    еще раз. то что одно берется из одной, другое из другой - это и ежу понятно. это постановка задачи такая. одно будет жить в одной, а другое - в другой.

    а вот какое одно брать из одной, и какое другое из другой - нигде не написано. я по крайней мере этого не вижу.
     
  8. aziz

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

    С нами с:
    1 фев 2006
    Сообщения:
    194
    Симпатии:
    0
    Адрес:
    Ташкент
    Из 1.таблицы фио беру фамилии и имя.
    из 2.таблицы день беру дни недели.
    из 3.таблицы пред беру "первое"..."седьмое".(данные из этой таблицы меняют очередность в зависимости от дня недели)
    из 4.таблицы очки (её дампа здесь нет.) беру заполняющие цыфры.

    теперь 4 табл. связано с 1,2.3. таблицами. к примеру, если смотрим Смирнов Андрей то у него в понедельник в графе первое 2 очка и тд. отдельно все таблицы создал, но немогу их объеденить что бы при выход получить нужную мне таблицу.
     
  9. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    базы данных были специально созданы для того, чтобы можно было произвольно и по-всякому из них данные выдергивать.

    то что вы "берете данные" из них вам ничего не дает. они могут идти в любой последовательности. То что у вас у Смирнова Андрея в понедельник раз от раза два очка - это не более чем по сути случайность. Вам необходимо строго указать, что, мол, данная строка в таблице очков принадлежит андрею и понедельнику. Панимай?
     
  10. aziz

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

    С нами с:
    1 фев 2006
    Сообщения:
    194
    Симпатии:
    0
    Адрес:
    Ташкент
    Это я прекрасно понимаю, вто мто и проблема что не получается у меня это сделать. Не могу никак связять эти таблицы и заставит вывести донные так, как задумано. Игорь? если не ошибаюсь, быть может где нибудь есть скрипт похожий, что бы можно было посмотреть и понять как энто всё делается?
     
  11. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    ну вот такой пример

    есть три группы - админы, клиенты и исполнители.

    заводим одну таблицу, где эти группы описаны
    groups
    id, name, description, rights - айди, название, описание, и права которые они имеют. Это одна строка. Одна запись.
    1, Администратор, Рулит тут всяким, создавать_пользователей/удалять_пользователей
    2, Клиент, Всегда прав, читать/спрашивать
    3, Исполнитель, Работает без предоплаты, читать/писать/отвечать

    Все просто. Не важно как, но вот их три.

    Теперь у нас есть необходимость вести список пользователей
    users
    id, name
    соотв - айди, имя
    1, Вася
    2, Петя
    4, Федя
    8, Марина
    9, Егор
    кого-то удалили видимо... =)

    Теперь надо раздать права и обязанности =). Но это можно было бы сделать и в той же таблице. Не важно. Главное, чтобы связь была.

    id, user_id, group_id
    1, 1, 1
    2, 2, 1
    3, 4, 2
    4, 8, 3
    5, 9, 3

    В принципе можно и во второй же таблице сразу указать их права. например так
    users
    id, name, group
    соотв - айди, имя, группа
    1, Вася, 1 - вася админ. сразу видно.

    Но тогда один человек не может обладать правами и исполнителя и админа. если это нужно - как раз нужна таблица третья. В нее в таком случае будет входить еще одна запись про того же человека


    id, user_id, group_id
    1, 1, 1 - Вася тут
    2, 2, 1
    3, 4, 2
    4, 8, 3
    5, 9, 3
    6, 1, 3 - Вася тут

    Тогда можно сделать выборку Select * where user_id='Вася' и получить что вася является исполнителем и несет бремя админа в одном лице.

    Вот так.

    А когда вы выбираете подряд все данные и считаете что они как-то между собой соотносятся - это иллюзия. =) Вы даже дату создания записи не храните. Вы по id выборку строите? И если кто-то что-то исправить захочет, и 6 id из одной таблице не будет соответстовать ни одна запись во второй? Ну вот удалили ее внесли новую.

    Или у вас строго по id привязано и пофик? Допустим так. Тогда нужно указать ORDER BY чтобы точно знать, что в том и том цикле шестой строкой пойдет все про Васю. Но тогда отпадает нужда делать три таблицы. Раз они являются по сути продолжением строки одной и той же.

    Таблицы нужны когда в одной таблице васи, а в другой
    понедельник - 2
    вторник - 5
    а среду вася пропустил - он болел.
    четверг - 17
    и все это про васю.

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

    id(по сути тут и не нужен), user_id, day_id или day (зависит от того как вы храните дни), и собственно эти баллы. Строка будет выглядеть для васи так

    1, 1, 1, 2
    2, 1, 2, 5
    3, 1, 4, 17

    Для пети так
    4, 2, 1, 6
    5, 2, 2, 12
    6, 2, 3, 7
    7, 2, 4, 5

    Выборка строится по второй колонке - айди человека, с ордербай третьей колонкой - если в хронологическом порядке. (А если хотим построить допустим в убывающем типа в четверг Вася набрал больше всего баллов, а во вторник чуть меньше - соотв по четвертой.)

    Вот...

    Если у вас понедельник + еще раунды или этапы соревнования, или там еще что, надо добавить поле, опять же.
    например
    4, 2, 1, сюда, 6

    ясно изложил?
     
  12. aziz

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

    С нами с:
    1 фев 2006
    Сообщения:
    194
    Симпатии:
    0
    Адрес:
    Ташкент
    Спасибо за пример. Сегодня попробую разобраться.