PHP while语句重复出现
我是PHP新手,我花了几个小时研究并试图找出我做错了什么。我将连接多个表,用一个事务表中的多个事务填充一个客户机配置文件页面。页面的其余部分正在按预期处理查询,但当使用while语句时,结果中的每个事务重复的次数等于结果中的事务总数。例如,如果结果有3个事务编号(1、2、3),则while语句会回显“1、1、1、2、2、3、3、3”,而不仅仅是“1、2、3” 我知道这很简单,但它让我毛骨悚然。请帮助:PHP while语句重复出现,php,while-loop,duplicates,echo,Php,While Loop,Duplicates,Echo,我是PHP新手,我花了几个小时研究并试图找出我做错了什么。我将连接多个表,用一个事务表中的多个事务填充一个客户机配置文件页面。页面的其余部分正在按预期处理查询,但当使用while语句时,结果中的每个事务重复的次数等于结果中的事务总数。例如,如果结果有3个事务编号(1、2、3),则while语句会回显“1、1、1、2、2、3、3、3”,而不仅仅是“1、2、3” 我知道这很简单,但它让我毛骨悚然。请帮助: if(!isset($_GET['PeopleID'])){ header
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
查询的预期行为
当你以你所拥有的方式左键连接时,你会多次得到所有的数据。这最好用一个例子来解释
例子
假设您有三个表:
表1
=>您的主表
table2
=>与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
表3
=>与表1的多对一关系
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
接下来,我们希望从表1
中选择数据,同时使用左连接合并表2
中的数据
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
请注意,上面的输出实际上是表1
中的每个选定行乘以表2
中相应行的数量;或者
every row in table1 * table2 rows with fkey=table1.id
所以,这很简单。如果我们现在看一个示例,其中有三个表和两个左连接
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
好的。。。因此,这是您的SQL
查询的预期行为
当你以你所拥有的方式左键连接时,你会多次得到所有的数据。这最好用一个例子来解释
例子
假设您有三个表:
表1
=>您的主表
table2
=>与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
表3
=>与表1的多对一关系
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
接下来,我们希望从表1
中选择数据,同时使用左连接合并表2
中的数据
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
请注意,上面的输出实际上是表1
中的每个选定行乘以表2
中相应行的数量;或者
every row in table1 * table2 rows with fkey=table1.id
所以,这很简单。如果我们现在看一个示例,其中有三个表和两个左连接
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
非常感谢。这非常有帮助。先生,您是一位绅士和学者。谢谢您!这非常有帮助。先生,你是一位绅士和学者。