【发布时间】:2016-10-22 11:05:16
【问题描述】:
我想在我的 CodeIgniter 商店中扩展 UI,提供关于其他人购买当前产品的建议(查看产品时或将产品放入购物车时,现在与问题无关)。 我想出了这个查询(orders 表包含订单详细信息,而 order items 包含通过外键按特定顺序排列的产品,prd 别名用于 products 表,其中存储了有关产品的所有重要信息)。 查询看起来像这样
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 查询分析器抱怨这两件事,Non-deterministic GROUP BY 和 GROUP BY or ORDER BY on different tables,两者我需要这样才能获得与相关查询实际相关的项目,但绝对不知道如何修复它,或者我什至应该对来自查询分析器的通知感到困扰。
第二个问题是关于性能的,因为对于这个查询,它使用临时和文件排序,我正在考虑从这个查询中创建一个视图,并在每次打开某些产品时使用它而不是实际执行查询。
请注意,我不是在询问 CI 模型/视图/控制器提示,只是有关如何优化此查询的提示,和/或有关性能和寻求视图方法的建议...
任何帮助都将不胜感激。
【问题讨论】:
-
你为什么要双重加入order_items?
-
@krasipenkov 第一个查找订单项目与订单本身之间的关系,第二个查找所选项目与订单中现有项目之间的关系(或者至少这是我的想法)
标签: mysql query-optimization innodb