【问题标题】:PHP while statement echoes duplicatesPHP while 语句回显重复项
【发布时间】:2021-02-07 12:21:05
【问题描述】:

我是 PHP 新手,我花了几个小时研究并试图找出我做错了什么。我正在加入几个表以使用事务表中的多个事务填充客户配置文件页面。页面的其余部分按预期使用查询,但是当使用 while 语句时,结果中的每个事务重复等于结果中的事务总数。例如,如果结果有 3 个事务编号 (1, 2, 3),则 while 语句回显“1, 1, 1, 2, 2, 2, 3, 3, 3” 而不仅仅是“1, 2, 3"。

我知道这很简单,但它让我把头发拔了出来。请帮忙:

    if(!isset($_GET['PeopleID'])){
      header('Location: people.php');
      die();
    } else {
      if(!filter_var($_GET['PeopleID'], FILTER_VALIDATE_INT)){
        header('Location: people.php');
        die();
      } else {
        $PeopleID = filter_var($_GET['PeopleID'], FILTER_VALIDATE_INT);
        $query = "SELECT *
          FROM
            people
          LEFT JOIN notes ON 
            PersonID = PeopleID
          LEFT JOIN filenumbers ON 
            id = PeopleID   
          LEFT JOIN transactions ON 
            transactions.FileNumberID = filenumbers.FileNumberID
          LEFT JOIN filingdetails ON 
            filingdetails.FileID = filenumbers.FileNumberID
          WHERE PeopleID=:PeopleID";
  
         $result = $db_connection->prepare($query);
         $result->execute([
           'PeopleID' => $PeopleID
         ]);
       }
    }

    while($row = $result -> fetch()){
      echo $row['TransactionNumber'] . ", ";

    }

【问题讨论】:

    标签: php while-loop duplicates echo


    【解决方案1】:

    好的...所以,这是您的 SQL 查询的预期行为。

    当您LEFT JOIN 时,您最终会多次获取所有数据。这最好用一个例子来解释......

    示例

    假设您有三个表:

    table1 => 你的主表

    table2 => 与table1 的多对一关系

    table3 => 与table1 的多对一关系

    table1
    id, value
    1, a
    2, b
    3, c
    
    table2
    id, fkey, value
    1, a, xxxx
    2, a, cxcz
    3, a, bdtht
    4, a, nbtyt
    5, b, ngftht
    6, b, thhgfj
    7, b, gjfhj
    8, c, hjghj
    9, c, jhgjh
    
    table3
    id, fkey, value
    10, 2, sdgvgd
    11, 2, gjkmhkjk
    12, 3, kjhkl
    13, 3, kljj
    

    接下来,我们要使用table1 中的SELECT 数据,同时合并来自table2 的数据,使用LEFT JOIN

    SELECT
        table1.id, table1.value, table2.id, table2.value
    FROM table1
        LEFT JOIN table2 ON 
            table2.fkey = table1.id
    

    上述SQL 的输出将如下所示...

    table1.id, table1.value, table2.id, table2.value
    1, a, 1, xxxx
    1, a, 2, cxcz
    1, a, 3, bdtht
    1, a, 4, nbtyt
    2, b, 5, ngftht
    2, b, 6, thhgfj
    2, b, 7, gjfhj
    3, c, 8, hjghj
    3, c, 9, jhgjh
    

    请注意,上面的输出实际上是table1 中的每个选定行乘以table2 中相应行的数量;或者...

    every row in table1 * table2 rows with fkey=table1.id 
    

    所以,这很简单。如果我们现在看一个包含三个表和两个LEFT JOINs的示例

    SELECT
        table1.id, table1.value, table2.id, table2.value
    FROM table1
        LEFT JOIN table2 ON 
            table2.fkey = table1.id
        LEFT JOIN table3 ON 
            table3.fkey = table1.id
    
    
    table1.id, table1.value, table2.id, table2.value, table3.id, table3.value
    1, a, 1, xxxx, null, null
    1, a, 2, cxcz, null, null
    1, a, 3, bdtht, null, null
    1, a, 4, nbtyt, null, null
    2, b, 5, ngftht, 10, 2, sdgvgd
    2, b, 5, ngftht, 11, 2, gjkmhkjk
    2, b, 6, thhgfj, 10, 2, sdgvgd
    2, b, 6, thhgfj, 11, 2, gjkmhkjk
    2, b, 7, gjfhj, 10, 2, sdgvgd
    2, b, 7, gjfhj, 11, 2, gjkmhkjk
    3, c, 8, hjghj, 12, 3, kjhkl
    3, c, 8, hjghj, 13, 3, kljj, 
    3, c, 9, jhgjh, 12, 3, kjhkl
    3, c, 9, jhgjh, 13, 3, kljj
    

    在这里你可以看到我们现在的输出相当于:

    every row in table1 * table2 rows with fkey=table1.id * table3 rows with fkey=table1.id
    

    【讨论】:

    • 谢谢!这非常有帮助。先生,您是一位绅士和一位学者。
    猜你喜欢
    • 2014-12-18
    • 1970-01-01
    • 1970-01-01
    • 2019-02-05
    • 2018-10-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多