可以在MySQL中运行WHILE循环吗?

时间:2009-12-24 13:19:05

标签: php mysql

使用传递给另一个表获取结果的每一行的ID,在while循环中使用mysql查询是否可以?或者有更好的方法吗?

$q = $__FROG_CONN__->query("SELECT cms_page.id, cms_page.title, cms_page.slug, cms_page_part.* FROM cms_page LEFT JOIN cms_page_part ON cms_page_part.page_id=cms_page.id WHERE cms_page.parent_id='8'");
$r = $q->fetchAll(PDO::FETCH_ASSOC);

echo '<ul id="project-list">';
  foreach ($r as $row) { 
    echo '<li>';
    echo '<a href="'.$row["slug"].'.html"><img src="<img src="phpThumb/phpThumb.php?src=public/images/'.$row[0].'/th.jpg&w=162" alt="" /></a>';
    echo '<div class="p-text">';
    echo '<h4>'.$row["location"].'<span>'.$row["project_date"].'</span></h4>';
    echo '<p>'.$row["body"].'</p>';
    echo '</div>';
    echo '</li>';
  }
echo '</ul>';

我试图从另一个sql查询匹配的表中提取project_date,body和location字段。标题和slug保存在另一个表中。应该只有最多八个左右的结果,但我会得到更多。

6 个答案:

答案 0 :(得分:3)

使用IN的建议很好,但如果您从另一个查询中获取ID,最好使用连接将这两个查询合并为一个查询。

而不是:

SELECT id FROM users WHERE age <30
SELECT id, x FROM userinfo WHERE userid IN ($id1, $id2, ..., $idn)

做的:

SELECT users.id, userinfo.x
FROM users
LEFT JOIN userinfo ON userinfo.userid = users.id
WHERE age < 30

答案 1 :(得分:1)

为了减少预先形成查询的开销,您可能希望查看在单个查询中获取所有数据。在这种情况下,您可能需要查看IN(),例如

SELECT * WHERE x IN (1, 2);

还有BETWEEN()

SELECT * WHERE x BETWEEN 1 AND 2;

有关详细信息,请参阅mysql docs

答案 2 :(得分:0)

在一个小应用程序/小结果集中,这可能没问题,但它会导致对数据库的大量(小)调用。

如果您可以找到另一种方法(可能请参阅Yacoby's suggestion?),您可以在其中对数据库进行一次调用,这可能更好。

修改

如果您只对一个表中的ID感兴趣,为了从另一个表中获得正确的结果,或许您正在寻找JOIN?

SELECT t1.fieldA, t1.fieldB
FROM table1 t1
JOIN table2 t2 ON t1.ID = t2.ID
WHERE t2.someField = 'someValue'

答案 3 :(得分:0)

我会尝试以我只需要传递一次的方式构建查询。类似于WHERE ID = 1或ID = 2 OR ...在处理和网络流量方面,传递多个查询并返回多个记录集的成本很高。

答案 4 :(得分:0)

  

使用传递给另一个表获取结果的每一行的ID,在while循环中使用mysql查询是否可以?或者有更好的方法吗?

您应该在SQL中重新构建查询。比如说,将id放入内存表并在JOIN

中使用它
SELECT  *
FROM    idtable
JOIN    mytable
ON      mytable.id = idtable.id

这样,MySQL将为您制作循环,但会以(通常)更有效的方式制作它们。

SQL是一种用于处理集合的语言。

因此,如果你有一组id和一个表(一组元组),你首先想到的是“我如何使用{{1将基于集合的操作应用于这些集合}}“?

当然可以在循环中运行一堆简单的查询,但这样你就可以做SQL引擎开发人员最有可能为你完成的额外工作(并且通常以更有效的方式完成它)方式)。

您可能希望在我的博客中阅读这篇文章:

答案 5 :(得分:0)

这将是非常低效的,您想要的是加入ID上的表

SELECT * FROM table1 LEFT JOIN table2 ON (table1.ID = table2.ID) WHERE condition  

Mysql join documentation

这将返回一组行,其中包含从两个表中返回的所有信息。