За последние 24 часа нас посетили 68086 программистов и 1649 роботов. Сейчас ищут 956 программистов ...

Вывод данных из базы MySQL

Тема в разделе "PHP и базы данных", создана пользователем EndoCrinolog, 12 июн 2013.

  1. EndoCrinolog

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

    С нами с:
    4 фев 2012
    Сообщения:
    205
    Симпатии:
    1
    Адрес:
    Тольятти
    Доброе утро, уважаемые программисты. У меня есть сайт с табличными данными покера (ну, увлекаемся с друзьями, интересно же знать кто сколько и когда). Так вот.
    Сейчас там используется файловая база данных. Сейчас объясню, что это такое.

    Когда я только только создал сайт, я столкнулся с проблемой добавления новых игроков в базе MySQL. Меня охватила паника - как это сделать??? Поэтому я сачконул и сделал так:
    1) Все имена игроков записываются в файлы по типу player[N].nm. Соответственно, в отдельном файле players.cou я храню общее количество игроков
    2) Все дни, в которые мы играли в покер, я храню в файлах day[M].day, в котором записана дата игры (2.06.2012, 4.07.2012 и т.д.). Соответственно, в отдельном файле days.cou я храню общее количество сыгранных нами дней.
    3) КОНЕЧНЫЙ РЕЗУЛЬТАТ (то есть, не то количество денег, которое он выиграл, а то, которое у него стало на данный момент) я записывал в файлы p[N]d[M].mon. Пример: человек начал только вот играть 1.01.01 и он проиграл 10 рублей, следовательно, в статистику на 1.01.01 будет записано -10. Он 2.02.02 проиграл 12 рублей, следовательно, в статистику на 2.02.02 у него будет записано НЕ -12, а -22! Вот о чем я говорю.

    Так вот. В чем моя проблема. Мне надоело всё дело хранить в файлах, потому что надоело качать по 700 файлов результатов. + долго страница загружается (на странице 2 цикла: 1 цикл формирует шапку, второй - двойной. наружный for для дней, внутренний - для игроков (формирование файла p[N]d[M].mon)).

    Я создал базу и в ней 3 таблицы:
    Таблица №1 [Имена игроков]: {ID | Имя игрока} - id | player
    Таблица №2 [Даты]: {ID | Дата} - id | day
    Таблица №3 (самая важная) [Игры]: {ID | ID игрока | ID дня | Результат} - id | player_id | day_id | result

    Примерная структура третьей таблицы:
    Так вот. Я никак не могу подобрать запрос (или ряд запросов) MySQL, чтобы вывести все данные таблицы, как это сейчас выведено на сайте http://pokerstat.hol.es. Ну, цвета не обязательно, НО главное, чтобы было выведено так, как сейчас выглядит главная страница сайта. Очень прошу кого-нибудь помочь с запросами.

    P.S. Если хотите - можете посмотреть на сайте на интересную диаграмму :) Она внизу таблицы :)

    Заранее, огромное спасибо!
     
  2. artoodetoo

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

    С нами с:
    11 июн 2010
    Сообщения:
    11.128
    Симпатии:
    1.248
    Адрес:
    там-сям
    Тут не нужен хитрый запрос. Простой GROUP BY день, игрок (в таблице №3).

    Первый этап: считывание записей. Потребуется небольшая обработка результатов на PHP: массивы "счетчиков" для колонок и для столбцов. Всего три массива -- $data[y][x], $rows[y], $cols[x]

    Код (PHP):
    1. $result = $db->query(
    2.     "SELECT ".
    3.     "  `player_id` AS `name`, ".
    4.     "  `day_id` AS `date`, ".
    5.     "  COUNT(*) AS `count`, ".
    6.     "  SUM(`result`) AS `score` ".
    7.     "FROM `table3` ".
    8.     "GROUP BY `player_id`, `day_id`"
    9. );
    10. $cols = $rows = $data = array();
    11. while ($a = $db->fetchAssoc($result)) {
    12.     $y = $a['date'];
    13.     $x = $a['name'];
    14.     $count = $a['count'];
    15.     $score = $a['score'];
    16.  
    17.     $cols[$x] = (isset($cols[$x]) ? $cols[$x] : 0) + $count;
    18.     $rows[$y] = (isset($rows[$y]) ? $rows[$y] : 0) + $count;
    19.     $data[$y][$x] = $score;
    20. }
    Второй этап: вывод таблицы.
    [​IMG]
    С заголовками таблицы всё просто: это значения из $rows и $cols. Тело таблицы: вложенные циклы foreach() по массивам $rows и $cols, вывод пересечения $data[$y][$x] если такое существует или прочерк если не существует.

    Код (PHP):
    1. <table>
    2.     <thead>
    3.         <tr>
    4.             <td>ДНИ</td>
    5. <?php foreach ($cols as $y => $col_value): ?>            <th scope="col"><?= $y ?><br>(<?= $col_value ?>)</th>
    6. <?php endforeach; ?>
    7.         </tr>
    8.     </thead>
    9.     <tbody>
    10. <?php
    11. foreach ($rows as $y => $line_value): 
    12. ?>
    13.         <tr>
    14.             <th scope="row"><sup><?= $line_value ?></sup> <?= $y ?></th>
    15. <?php 
    16.     foreach ($cols as $x => $col_value): 
    17.         if (isset($data[$y][$x])):
    18. ?>            <td><?=  $data[$y][$y] ?></td>
    19. <?php
    20.         else:
    21. ?>            <td>--</td>
    22. <?php 
    23.         endif;
    24.     endforeach; 
    25. ?>
    26.         </tr>       
    27. <?php
    28.   </tbody>
    29. </table>
    30. endforeach;
    Как-то так.
     
  3. EndoCrinolog

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

    С нами с:
    4 фев 2012
    Сообщения:
    205
    Симпатии:
    1
    Адрес:
    Тольятти
    Хм... Надо будет проверить :) Спасибо за совет. Будет время - интегрирую
     
  4. artoodetoo

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

    С нами с:
    11 июн 2010
    Сообщения:
    11.128
    Симпатии:
    1.248
    Адрес:
    там-сям
    в твоих словах чую недоверие я 8()
    ты вникай. как таблица рисуется вложенными циклами понятно? пойми как работает group-by, а больше тут ничего и нет.

    Добавлено спустя 1 минуту 38 секунд:
    я правда не стал заострять внимание на том, что player_id это не имя, а номер. но с этим ты сам справишся потом ;)
     
  5. EndoCrinolog

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

    С нами с:
    4 фев 2012
    Сообщения:
    205
    Симпатии:
    1
    Адрес:
    Тольятти
    А вот у меня такой вопрос... У меня есть столбец в таблице, где через запятую перечисляются пользователи: user1,user2,users3

    Мне нужно вывести только те строки, где в ячейках есть user2. Как осуществить такой SELECT?

    Добавлено спустя 1 минуту 25 секунд:
    Кстати, да. Переход осуществил на MySQL своего покерного сайта. Если хотите, можете зайти посмотреть
    http://pokerstat.hol.es
     
  6. Dmitriy A. Arteshuk

    Dmitriy A. Arteshuk Активный пользователь

    С нами с:
    19 янв 2012
    Сообщения:
    2.445
    Симпатии:
    66
    Адрес:
    Зеленоград
    Веб-сайт pokerstat.hol.es содержит элементы с других сайтов, которые, по нашим данным, являются фишинговыми. Фишинговые сайты обманом получают от пользователей личную или финансовую информацию, выдавая себя за сайты доверенных учреждений, например банков.

    Хром
     
  7. EndoCrinolog

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

    С нами с:
    4 фев 2012
    Сообщения:
    205
    Симпатии:
    1
    Адрес:
    Тольятти
    у хрома всегда проблемы. разрешите. я же захожу. скриншот таьлицы вы видели
     
  8. artoodetoo

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

    С нами с:
    11 июн 2010
    Сообщения:
    11.128
    Симпатии:
    1.248
    Адрес:
    там-сям
    Ну во первых, ты зря так сделал! Есть обходные трюки, но это не по "реляционному" :)