我希望在我的CodeIgniter商店上扩展用户界面,并提供其他人使用当前产品购买的建议(无论是在查看产品时还是将产品放入购物车时,现在与问题无关)。 我提出了这个查询(订单表包含订单详细信息,而订单商品包含通过外键按特定顺序排列的产品,prd别名用于产品表,其中存储了有关产品的所有重要信息)。 查询看起来像这样
SELECT
pr.product_id,
COUNT(*) AS num,
prd.*
FROM
orders AS o
INNER JOIN order_items AS po ON o.id = po.order_id
INNER JOIN order_items AS pr ON o.id = pr.order_id
INNER JOIN products AS prd ON pr.product_id = prd.id
WHERE
po.product_id = '14211'
AND pr.product_id <> '14211'
GROUP BY
pr.product_id
ORDER BY
num DESC
LIMIT 3
它工作得很好,花花公子,查询时间是0.030秒秒,它返回与我正在查看的产品一起购买的产品。
至于问题和考虑因素,Percona查询分析器抱怨这两件事,非确定性GROUP BY 和 GROUP BY或ORDER BY在不同的表,这两者都是我需要这样才能获得与相关查询实际相关的顶级项目,但绝对不知道如何解决它,甚至我应该对查询分析器的这个通知感到困扰。
第二个问题是关于性能,因为对于这个查询,它使用临时和filesort,我正在考虑从这个查询创建一个视图,并使用它而不是每次打开某个产品时实际执行查询。
请注意,我不是要求提供CI模型/视图/控制器提示,只是提供有关如何优化此查询的提示,和/或有关性能和观看方法的建议......
任何帮助都非常值得赞赏。
答案 0 :(得分:1)
SELECT p.num, prd.*
FROM
(
SELECT a.product_id, COUNT(*) AS num
FROM orders AS o
INNER JOIN order_items AS b ON o.id = b.order_id
INNER JOIN order_items AS a ON o.id = a.order_id
WHERE b.product_id = '14211'
AND a.product_id <> '14211'
GROUP BY a.product_id
ORDER BY num DESC
LIMIT 3
) AS p
JOIN products AS prd ON p.product_id = prd.id
ORDER BY p.num DESC
这应该
忽略来自不同表格的GROUP BY
和ORDER BY
投诉 - 这是一个性能问题;你需要它。
至于将其转换回CodeIgniter,祝你好运。