使用传递给另一个表获取结果的每一行的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保存在另一个表中。应该只有最多八个左右的结果,但我会得到更多。
答案 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
这将返回一组行,其中包含从两个表中返回的所有信息。