Невозможно преобразовать значения таблицы строк в поля столбцов в запросах PHP - PullRequest
0 голосов
/ 14 марта 2019

У меня есть значение массива в базе данных, как в приведенной ниже таблице, я хочу попробовать отсортировать данные на основе значения значения поля A по столбцу и поля B как значения столбца A, но я не могу разобрать

    NO|  field_A    |field_B
   ---------------------------
    1 | username    | brian
    1 | email       | brian@myx.com
    1 | date_birth  | 1996-06-09
    1 | place_birth | Chichago
    2 | username    | adams
    2 | email       | adam@fgc.com
    2 | date_birth  | 1990-07-11
    2 | place_birth | Manhattan
    3 | username    | john
    3 | email       | john@box.com
    3 | date_birth  | 1988-10-02
    3 | place_birth | Miami

Я ожидал

    No  |  Username     |  Email           | Date Birth     | Place Birth   | 
    -------------------------------------------------------------------------
    1   |  brian        |   brian@myx.com   | 1996-06-09    |   Chichago    |
    2   |  adams        |   adam@fgc.com    | 1990-07-11    |   Manhattan   |
    3   |  john         |   john@box.com    | 1988-10-02    |   Miami       |

MyScript

<table class="table table-striped table-bordered table-hover">
    <thead>
        <tr>
            <th>NO</th>
            <th>Username </th>
            <th>Email </th>
            <th>Date Birth</th>
            <th>Place Birth</th>
        </tr>
    </thead>
    <tbody>

    <?php
    $q = mysqli_query($server, "SELECT * FROM my_tabel ") or die ($server->error);
    $result = array();
    while ($row = mysqli_fetch_array($q)) {
          $result[] = $row;
    }
        foreach($result as $key => $rowx) {
            echo "<tr>";                  
            echo "<td>" .$rowx['username']. "</td>" ; 
            echo "<td>" .$rowx['email']. "</td>"; 
            echo "<td>" .$rowx['date_birth']. "</td>"; 
            echo "<td>" .$rowx['place_birth']. "</td>";     
            echo "</tr>";
        }      
    ?>
    </tbody>
</table>

Ответы [ 4 ]

1 голос
/ 15 марта 2019

Как я уже упоминал в комментариях, такого рода дизайн базы данных - не что иное, как боль и страдание ... и не так много людей с таким же отношением к "HURT ME MORE" в отношении SQL, как я.Поэтому, конечно, я смоделировал вашу таблицу и значения и приступил к некоторым исследованиям, чтобы найти способ сделать это полностью в SQL.

В другом комментарии я упомянул смутно похожий вопрос, на который я ответил , и ваши требования намного проще и могут быть решены с помощью простого поворота в SQL.MySQL не имеет правильных точек, но, очевидно, можно стать хитрым:

SELECT NO,
    MAX(CASE WHEN (field_A = 'username') THEN field_b END) AS username,
    MAX(CASE WHEN (field_A = 'email') THEN field_B END) AS email,
    MAX(CASE WHEN (field_A = 'date_birth') THEN field_B END) AS date_birth,
    MAX(CASE WHEN (field_A = 'place_birth') THEN field_B END) AS place_birth
FROM my_tabel1
GROUP BY NO

С помощью этого вы можете полностью выполнять манипуляции с данными в коде SQL (где он есть), а PHP может просто захватывать и отображатьпо-прежнему.Хотя я все еще подчеркиваю, что такой дизайн действительно не рекомендуется, особенно учитывая, что псевдостолбцы таблицы (имя пользователя, адрес электронной почты и т. Д.) Выглядят довольно конкретными.Я бы, наверное, пошел искать лучший сторонний плагин для всего, что вы делаете.

Отказ от ответственности: Это было смоделировано и протестировано только с SQL Server и SQL Fiddle, так как на данный момент у меня нет доступных машин с MySQL.

1 голос
/ 14 марта 2019

Вы можете переставить массив таким образом: Но ... да.Это ни хорошо, ни перформанс

$databaseValues = [
    [
        'no' => 0,
        'field_a' => 'username',
        'field_b' => 'brian'
    ],
    [
        'no' => 1,
        'field_a' => 'email',
        'field_b' => 'adam@fcg.com'
    ],
    [
        'no' => 1,
        'field_a' => 'username',
        'field_b' => 'adam'
    ],
    [
        'no' => 0,
        'field_a' => 'email',
        'field_b' => 'brian@fcg.com'
    ]
];

$table = [];
foreach ($databaseValues as $row) {
    ['no' => $userId, 'field_a' => $columnName, 'field_b' => $columnValue] = $row;
    if (!isset($table[$userId])) {
        $table[$userId] = ['id' => $userId];
    }

    $table[$userId][$columnName] = $columnValue;
}

/* you can sort it; e.g. */
uasort($table, function($left, $right) {
    return $left['username'] <=> $right['username'];
});

/* output for demonstration */
foreach ($table as $user) {
    echo $user['username'] . PHP_EOL;
    echo $user['email'] . PHP_EOL;
}
0 голосов
/ 14 марта 2019

Если шаблон одинаков в поле 1 для каждой записи, то его построение без динамической ассоциации будет работать.вот так:

<?php
 /// lets get our col names looks like the col No is not a field 
$q = "SELECT DISTINCT field_A FROM my_tabel";
$result = $server->query($q)or die (mysqli_error($server));
echo '<table>';
echo '<tr><th>No.</th>';
//now I loopout the names 
 while ($line = $result->fetch_row()) {
 echo '<th>';
 for ($cell=0; $cell<$result->field_count; $cell++) {
 echo $line[$cell];
 }
 echo '</th>';
 }
 echo '</tr>';
 // now we draw the rest of it with two loopouts 
 // first query defines lines the other loops in the cells
 $qq = "SELECT DISTINCT NO FROM my_tabel";
 $rr = $server->query($qq)or die (mysqli_error($server));
      while ($li = $rr->fetch_row()) {
  echo '<tr>';
   for ($cl=0; $cl<$rr->field_count; $cl++) {
 echo $li[$cl];
 // now I get my data for the table cells at each distinct count of the NO col
  $xx="SELECT field_B from my_tabel where NO='".$li[$cl]."'"
  $rrr = $server->query($xx)or die (mysqli_error($server));
   while ($ccc = $rrr->fetch_row()) {
   echo '<td>';
    for ($sss=0; $sss<$rrr->field_count; $sss++) {
   echo '$ccc[$sss]';
   }
   echo '</td>';
    }

    }
  echo '</tr>';
  }

   echo '</table>';
0 голосов
/ 14 марта 2019

Ваша база данных разработана плохо, если я не ошибаюсь. Вы можете напечатать ваш $ result, чтобы увидеть, что хранится, но похоже, что у вас есть 3 столбца для ваших $ rowx NO, Поле A и Поле B. Если необходимо, вы должны переделать базу данных и сделать заголовки таблиц столбцами таблицы, а затем можете использовать ваш код в настоящее время. Прямо сейчас вам нужно повторить поля в вашем цикле.

  echo "<td>" .$rowx['NO']. "</td>" ; 
  echo "<td>" .$rowx['Field A']. "</td>"; 
  echo "<td>" .$rowx['Field B']. "</td>"; 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...