MySQL在php中循环两次:
$geta=mysql_query("SELECT id FROM table1 WHERE id<50");
while($row=mysql_fetch_array($geta)){
while($row2=mysql_fetch_array($geta)){
$id1=$row['id'];
$id2=$row2['id'];
echo "$id1 and $id2";
}
}
我正在尝试将id的每种可能组合与另一个id组合在一起。
不确定它有什么问题...输出只是id1的列表...
我在这里做错了什么?
答案 0 :(得分:3)
每次调用mysql_fetch_array()
时,都会从MySQL数据库中获取相同结果集的下一个结果。因此,在外部和内部循环中调用它只会使记录指针前进。
在您的情况下,您应首先将所有结果加载到单个数组,然后迭代:
// Array to hold all results
$results = array();
$geta = mysql_query("SELECT id FROM table1 WHERE id<50");
while($row = mysql_fetch_array($geta)){
// Append all rows to the array
$results[] = $row;
}
// Now iterate over your array $results in the outer & inner loops
foreach ($results as $r1) {
foreach ($results as $r2) {
echo "$r1 and $r2";
}
}
答案 1 :(得分:2)
您甚至可以使用简单的交叉连接
select t1.id,t2.id
from table as t1
cross join table as t2 on t1.id <= 50 and t2.id <= 50
答案 2 :(得分:1)
$geta = mysql_query("SELECT id FROM table1 WHERE id<50");
while($row = mysql_fetch_assoc($geta)) {
$all_ids = $row['id'];
}
foreach ($all_ids as $id_a) {
foreach ($all_ids as $id_b) {
echo "$id_a and $id_b", "<br>\n";
}
}
答案 3 :(得分:1)
编写一个执行工作的SQL语句...这比执行2个循环更快;允许数据库执行所有繁重的工作,您只需处理结果!
SELECT A.id, B.ID
FROM table1 A
cross join table1 B
WHERE A.id<50
答案 4 :(得分:1)
你应该这样做:
$geta=mysql_query("SELECT id FROM table1 WHERE id<50");
$getb=mysql_query("SELECT id FROM table1 WHERE id<50");
while($row=mysql_fetch_array($geta)){
while($row2=mysql_fetch_array($getb)){
$id1=$row['id'];
$id2=$row2['id'];
echo "$id1 and $id2";
}
}
或使用交叉连接
$getab=mysql_query("SELECT a.id as aid, b.id as bid FROM table1 a CROSS JOIN table1 b ON a.id = b.id WHERE a.id<50 AND b.id < 50");
while($row=mysql_fetch_array($getab)){
echo $row['aid'] . ' and ' . $row['bid'];
}
答案 5 :(得分:1)
你做的事没有意义。 mysql_fetch_*
函数通过结果集逐个前进。在你的代码中,外部循环对第一行执行一次,然后内部循环执行,直到你没有行为止。
您应该在SQL中进行交叉连接:
SELECT t1a.id AS id1, t1b.id AS id2 FROM table1 t1a, table1 t1b WHERE t1a.id<50 AND t1b.id<50
答案 6 :(得分:0)
问题非常简单:
while($row=mysql_fetch_array($geta)){
此while语句从结果对象$ geta中获取第一行。和
while($row2=mysql_fetch_array($geta)){
此循环从结果对象$ geta
中提取剩余的行然后在第二次循环之后,当它返回到第一个循环时,所有行都已经被取出,因此循环中的条件失败(因为没有更多的行要获取),因此循环退出。实际上你得到了id列表。
答案 7 :(得分:0)
mysql_fetch_array增加了相同结果集$ geta的内部搜索指针。所以它不起作用。如果您只是复制$ geta变量并使用它,那么它将起作用。
$geta=mysql_query("SELECT id FROM table1 WHERE id<50");
$geta2=$geta;
while($row=mysql_fetch_array($geta))
{
while($row2=mysql_fetch_array($geta2))
{
$id1=$row['id'];
$id2=$row2['id'];
echo "$id1 and $id2";
}
}