我认为如果我解释一下我想要做的事情会更容易。
假设我有2个表,一个是页面,另一个是视图。
每个页面都有一个唯一的ID,当访问该页面时,会在视图中输入一条记录。
说我想一起列出页面和页面的总视图。
所以我会有一个查询从数据库中选择页面并使用循环来显示它们,但我想查找它的总视图并在页面名称旁边显示该数字。
我将如何实现这一目标?
当我在fetch循环中运行查询时,出现以下错误:
Commands out of sync; you can't run this command now
感谢。
答案 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