如何在MySQLi fetch()循环PHP中执行查询

时间:2011-09-04 05:08:37

标签: php mysql

我认为如果我解释一下我想要做的事情会更容易。

假设我有2个表,一个是页面,另一个是视图。

每个页面都有一个唯一的ID,当访问该页面时,会在视图中输入一条记录。

说我想一起列出页面和页面的总视图。

所以我会有一个查询从数据库中选择页面并使用循环来显示它们,但我想查找它的总视图并在页面名称旁边显示该数字。

我将如何实现这一目标?

当我在fetch循环中运行查询时,出现以下错误:

Commands out of sync; you can't run this command now

感谢。

2 个答案:

答案 0 :(得分:2)

使用联接,如下所示:

SELECT page.*, view.*
FROM page
LEFT OUTER JOIN view
ON view.page_id = page.id

使用LEFT OUTER JOIN,仍会返回没有观看次数的网页,但view中的列将为NULL

这将为您提供一次查询所需的所有结果。通常,让数据库引擎完成将表关联在一起的工作要比自己做的更好。那么你只需要一次数据库引擎,它可以比你的代码更快地执行相关。


要获得计数,您可以执行join-with-group-by(可能是一个丑陋的查询,具体取决于您的数据库引擎)或带有子查询的查询:

SELECT
    page.*,
    (
        SELECT COUNT(view.id)
        FROM view
        WHERE view.page_id = page.id
    ) AS view_count
FROM page

group-by变体看起来像这样:

SELECT page.*, COUNT(view.id)
FROM page
LEFT OUTER JOIN view
ON view.page_id = page.id
GROUP BY page.id

根据您的数据库引擎和架构,您可能必须分组超过page.id

一个体面的查询规划器会将子查询示例转换为连接,因此两个查询的性能应该相似,如果不相同的话。不过,您应该使用EXPLAIN来确定一个变体是否优于另一个变体。

答案 1 :(得分:1)

为什么不在左连接中使用一个查询?

SELECT * FROM pages p LEFT JOIN views v ON p.id = v.page_id

如果您想要每页的观看次数:

SELECT p.*, v.*, COUNT(v.page_id) as views_count 
FROM pages p LEFT JOIN views v ON p.id = v.page_id 
GROUP BY p.id