PHP while 语句重复

PHP while statement echoes duplicates

我是 PHP 的新手,我花了几个小时研究并试图找出我做错了什么。我加入了几个 table 以使用交易 table 中的多个交易填充客户资料页面。页面的其余部分按预期处理查询,但是当使用 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'] . ", ";

    }

好的...因此,这是您的 SQL 查询的预期行为。

当您 LEFT JOIN 以您所拥有的方式结束时,您最终会多次获取所有数据。最好用一个例子来解释...

例子

假设您有三个 table:

table1 => 你的主要 table

table2 => many-to-one 与 table1

的关系

table3 => many-to-one 与 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

接下来我们想要 SELECT 来自 table1 的数据,同时合并来自 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 

所以,这很简单。如果我们现在看一个包含三个 table 和两个 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