相关产品进场建议,MySQL InnoDB/PHP
Related products approach suggestion, MySQL InnoDB/PHP
我想在我的 CodeIgniter 商店上扩展 UI,提供关于其他人用当前产品购买了什么的建议(无论是在查看产品时还是在将产品放入购物车时,现在与问题无关)。
我想出了这个查询(订单 table 包含订单详细信息,而订单项目包含通过外键按特定顺序排列的产品,prd 别名用于产品 table,其中存储了有关产品的所有重要信息).
查询看起来像这样
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 秒,它 returns 与我当前正在查看的产品一起购买的产品。
至于问题和注意事项,Percona 查询分析器抱怨这两件事,非确定性 GROUP BY 和 GROUP BY 或 ORDER BY 在不同的 tables,这两个都是我需要的,这样我就可以在顶部获得与相关查询实际相关的项目,但绝对不知道如何修复它,甚至我真的应该为此烦恼来自查询分析器的通知。
第二个问题是关于性能的,因为对于这个查询,它使用临时和文件排序,我正在考虑从这个查询中创建一个视图,并使用它而不是在每次打开某些产品时实际执行查询。
请注意,我不是要 CI model/view/controller 提示,只是关于如何优化此查询的提示,and/or 关于性能和获取视图方法的建议...
非常感谢任何帮助。
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,祝你好运。
我想在我的 CodeIgniter 商店上扩展 UI,提供关于其他人用当前产品购买了什么的建议(无论是在查看产品时还是在将产品放入购物车时,现在与问题无关)。 我想出了这个查询(订单 table 包含订单详细信息,而订单项目包含通过外键按特定顺序排列的产品,prd 别名用于产品 table,其中存储了有关产品的所有重要信息). 查询看起来像这样
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 秒,它 returns 与我当前正在查看的产品一起购买的产品。
至于问题和注意事项,Percona 查询分析器抱怨这两件事,非确定性 GROUP BY 和 GROUP BY 或 ORDER BY 在不同的 tables,这两个都是我需要的,这样我就可以在顶部获得与相关查询实际相关的项目,但绝对不知道如何修复它,甚至我真的应该为此烦恼来自查询分析器的通知。
第二个问题是关于性能的,因为对于这个查询,它使用临时和文件排序,我正在考虑从这个查询中创建一个视图,并使用它而不是在每次打开某些产品时实际执行查询。
请注意,我不是要 CI model/view/controller 提示,只是关于如何优化此查询的提示,and/or 关于性能和获取视图方法的建议...
非常感谢任何帮助。
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,祝你好运。