PHP MYSQL显示表a中的所有值,但仅显示表b中的匹配值,其中表b是单独的循环

时间:2018-08-18 14:44:21

标签: php mysqli while-loop

我正在努力使用while循环从表b中获取相应的值。我的数据库中有以下数据:

  

表A

     

编号-实体
  3000-ent1
  3010-ent1
  4000-ent1

     

表B

     

编号-实体
  3000-10
  3010-10
  3010-20
  4000-20
  3000-30
  4000-30

现在,我需要数据来输出下表,其中第一列来自表a,下一列来自表b:

  

ent1-10-20-30

     

3000-3000-空-3000
  3010-3010-3010-null
  4000-空-4000-4000

我尝试组合两个WHILE循环,但没有成功:

$query_entity = "SELECT number, entity FROM table_a ORDER BY number ASC";
$result_entity = mysqli_query($mysqli, $query_entity);

while ($entities = mysqli_fetch_array($result_entity)) {
    $entitiesAccount = $entities['number'];

    $query_entity_tabtwo = "SELECT number, entity 
                            FROM table_b 
                            WHERE number = $entitiesAccount";
    $result_entity_tabtwo = mysqli_query($mysqli, $query_entity_tabtwo);

    while ($entities_tabtwo = mysqli_fetch_array($result_entity_tabtwo)) {

        echo $entitiesAccount . " - " . $entities_tabtwo['number'];

    }
}

我得到的结果不是我上面想要的结果,因为该结果没有分隔表b中的“实体”字段。如何更改脚本以获得所需的结果?

3 个答案:

答案 0 :(得分:0)

您只需要在稍微不同的地方回声

$sql = "SELECT number, entity 
        FROM table_a 
        ORDER BY number ASC";
$result = mysqli_query($mysqli, $sql);

while ($row = mysqli_fetch_array($result_entity)) {
    $entitiesAccount = $row['number'];

    $sql = "SELECT number, entity 
            FROM table_b 
            WHERE number = $entitiesAccount";
    $result2 = mysqli_query($mysqli, $sql);

    echo $entitiesAccount;

    while ($row2 = mysqli_fetch_array($result2)) {

        echo " - " . $row2['number'];

    }
    echo '<br>';
}

答案 1 :(得分:0)

提示:这是JOINS与我们一起努力的地方。 BA DUM TSSSS

您可以使用ANSI syntax or the traditional where clause,它们的工作原理相同。

就您而言,您可以编写类似的内容。

SELECT ta.number, tb.entity
FROM tableA as ta
LEFT JOIN tableB as tb ON tb.number = ta.number
WHERE ta.entity = 'ent1'; // I suppose this is where you do the selection

现在您拥有来自tableA的所有行以及来自tableB的相关行 并假设您已在名为.... umm .... $result的数组变量中获取了所有结果。

现在,您只需要在php中隐喻巧手即可,如下所示...

<?php
$result      = []; // This comes from the mysql
$output      = [];
$columns_raw = [];
$entity_name = 'ent1'; // This comes from your selection logic the same that goes to sql.
foreach ($result as $row) {
    $columns_raw[]                            = $row['entity'];
    $output[$row['number']][$row['entity']][] = $row;
}
$columns = array_unique($columns_raw);

?>

我也给您写一点HTML。

<table>
    <thead>
    <th><?php echo $entity_name; ?></th>
    <?php foreach ($columns as $column) { ?>
        <th><?php echo $column; ?></th>
    <?php } ?>
</thead>
<tbody>
    <?php foreach ($output as $number => $row) { ?>
        <tr><?php echo $number; ?></tr>
        <tr><?php
            foreach ($columns as $column) {
                if (array_key_exists($column, $row)) {
                    echo $number;
                } else {
                    echo 'null';
                }
            }
            ?></tr>
    <?php } ?>
</tbody>
</table>

...还有瞧!

注意:-这完全可以称为“盲代码”,而我没有运行它。但这足以将您指向正确的方向。

答案 2 :(得分:0)

您可以在一个查询中完全生成数据。这样,您可以将PHP简化为一个while循环:

SELECT a.number AS ent1, 
    GROUP_CONCAT(CASE WHEN b.entity = 10 THEN b.number END) AS `10`,
    GROUP_CONCAT(CASE WHEN b.entity = 20 THEN b.number END) AS `20`,
    GROUP_CONCAT(CASE WHEN b.entity = 30 THEN b.number END) AS `30`
FROM table_a a
JOIN table_b b ON b.number = a.number
GROUP BY ent1

输出:

ent1    10      20      30
3000    3000    (null)  3000
3010    3010    3010    (null)
4000    (null)  4000    4000

Demo