我想扩展我的 CodeIgniter 商店的 UI,并提供有关其他人使用当前产品购买的商品的建议(无论是在查看产品时还是在将产品放入购物车时,现在与问题无关)。 我想出了这个查询(订单表包含订单详细信息,而订单项包含通过外键按特定顺序排列的产品,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,这两者我需要这样我才能在顶部获取与相关查询实际相关的项目,但完全不知道如何修复它,或者甚至我应该真的对查询分析器的这个通知感到困扰。
第二个问题是关于性能的,因为对于这个查询,它使用临时和文件排序,我正在考虑从这个查询中创建一个 View ,并使用它而不是每次打开某个产品时实际执行查询。
请注意,我并不是要求 CI 模型/ View / Controller 提示,只是要求有关如何优化此查询的提示,和/或有关性能和 View 方法的建议...
非常感谢任何帮助。
最佳答案
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,祝你好运。
关于mysql - 相关产品方法建议,MySQL InnoDB/PHP,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40191383/