php - MySQL查询根据投票加入2个表

标签 php mysql sql inner-join

我有一个 Web 应用程序,其中我使用 2 个表,一个用于存储产品信息,另一个用于存储每个产品的投票。

现在我想根据产品获得的投票数来显示产品。下面是表结构

产品:

PRODUCT_ID  TITLE
1           product1
2           product2
3           product3
4           product4

票数:

PRODUCT_ID  USER_ID
1           1
1           1
2           2
3           2

我期待一个结果以投票的降序显示产品

PRODUCT_ID  TITLE           VOTES
1           product1        2
2           product2        1
3           product3        1

目前我正在使用这样的查询

SELECT p.product_id, p.title, count(*) AS total FROM products p 
INNER JOIN votes v ON v.product_id = p.product_id  GROUP BY p.product_id 
ORDER BY count(*) DESC LIMIT 110

Products 表有大约 30,000 条记录,votes 表有大约 90,000 条记录。

现在的问题是它需要很多时间(随机在 18 到 30 秒之间)。由于表中的记录数不是那么多,我想知道为什么要花费这么长的时间。

注意到的一件事是,当我第二次运行查询时,它会在几毫秒内获取结果,我认为这是一个不那么复杂的查询的理想时间。

同样,我对编程的数据库方面还很陌生。

我不确定查询中是否有任何问题,或者是表结构效率不高(至少无法快速获取记录)。

最佳答案

首先,您的查询很好,但我倾向于采用不同的格式:

SELECT p.product_id, p.title, count(*) AS total
FROM products p INNER JOIN
     votes v
     ON v.product_id = p.product_id 
GROUP BY p.product_id 
ORDER BY count(*) DESC
LIMIT 110;

正如在另一个答案中提到的,votes(product_id) 上的索引肯定会帮助查询,如果您还没有的话。即使改进了 join 性能,您仍然有聚合的开销。而且,在 MySQL 中,这可能会产生大量开销。

如果您期望获得越来越多的选票——达到数百万——那么您可能需要采取另一种方法。一种方法是向某个表(可能是 products 表,在投票进入时跟踪投票)添加一个触发器。然后查询就会运行。另一种方法是定期汇总数据,类似于使用触发器但使用作业代替。

关于php - MySQL查询根据投票加入2个表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21803460/

相关文章:

php - CI 新的默认 Controller 不工作

php - jQuery/JavaScript : How to get the nth pair in a group of pairs?

mysql - 使用 SQL 管理历史和当前记录

sql - 使用 MySQL 获取包含值的行

javascript - 将 php 数组作为链接参数传递给 ajax 函数

php - 当我在我的 php.ini 文件中指定了 utf-8 时,为什么我的内部编码是 ISO-8859-1?

PHP - 如何根据 PHP 文件中的 MySQL 查询结果格式化单元格背景和字体颜色

mysql - 如何使用 SQL join 从闭包表中提取子 ID 和名称

php - 为什么下拉菜单在 codeigniter 中不起作用?

javascript - jQuery getJSON 打印名称为字符串的数组