mysql - 识别 SQL 中匹配次数最多的列中的 ID 对

标签 mysql sql

我正在尝试查找使用 MySQL 的共同客户数量最多的企业对。

表格如下:

+------------+------------+ 
| BusinessID | CustomerID |
+------------+------------+
| A          |          1 |
| A          |          2 |
| A          |          3 |
| B          |          4 |
| B          |          1 |
| B          |          3 |
| B          |          2 |
| C          |          3 |
| C          |          4 |
| C          |          5 |
+------------+------------+

我希望输出是企业对和共同客户的数量,如下所示:

+-------------+-------------+------------------------+
| BusinessID  | BusinessID  | Common Customers Count |
+-------------+-------------+------------------------+
| A           | B           |                      3 |
| A           | C           |                      1 |
| B           | C           |                      2 |
+-------------+-------------+------------------------+

这是我写的查询:

SELECT a.BusinessID,b.BusinessID,COUNT(*) AS ncom
FROM (SELECT BusinessID, CustomerID FROM MYTABLE) AS a JOIN       
     (SELECT BusinessID,CustomerID FROM MYTABLE) AS b 
     ON a.BusinessID < b.BusinessID AND a.CustomerID = b.CustomerID
GROUP BY a.BusinessID, b.BusinessID
ORDER BY ncom   

问题是我的数据集大约有 5m 行,这在大型数据集上似乎效率太低。我通过限制数据在较小的数据集上测试了查询 - 处理 10k 行需要 8 秒,处理 20k 行需要 30 秒,因此该查询无法运行 5m 行。我还能如何编写查询以使其更快?

最佳答案

不要使用子查询从表中获取列,这可能会阻止它使用索引。

SELECT a.BusinessID, b.BusinessID, COUNT(*) as ncom
FROM MYTABLE AS a
JOIN MYTABLE AS b ON a.BusinessID < b.BusinessID AND a.CustomerID = b.CustomerID
GROUP BY a.BusinessID, b.BusinessID
ORDER BY ncom

此外,为表指定以下索引:

CREATE INDEX ix_cust_bus ON MYTABLE (CustomerID, BusinessID);

关于mysql - 识别 SQL 中匹配次数最多的列中的 ID 对,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42590370/

相关文章:

php - 在不使用表单/字段的情况下将值从 View 传递到 Controller

php - 代码点火器 : how to update mulitiple record where id

mysql - 如何在酒店预订系统中准确获取取消预订房间的mysql查询?

MySql XNOR 等效项

java - java 中的日期比较搜索今天、明天

mysql - 通过rails session 参数过滤MySQL数据

javascript - jQuery 函数 $.post 和 .remove

java - 无法让 ManyToMany 处理 Hibernate Criteria 中的项目列表

mysql - 嵌套查询以获取两个条件的计数

python - 使用 cur.fetch_pandas_all() 从 Snowflake 提取数据时出现非唯一列索引错误