无法为3表内部联接(MySQL)-“客户也购买了”功能找到高效的SQL
我试图将购买“x”功能的典型客户也购买了“y”功能添加到我的网站中。以下是表格结构:无法为3表内部联接(MySQL)-“客户也购买了”功能找到高效的SQL,mysql,Mysql,我试图将购买“x”功能的典型客户也购买了“y”功能添加到我的网站中。以下是表格结构: Table: qb_invoice +--------------------------------+------------------+------+-----+-------------------+----------------+ | Field | Type | Null | Key | Default
Table: qb_invoice
+--------------------------------+------------------+------+-----+-------------------+----------------+
| Field | Type | Null | Key | Default | Extra |
+--------------------------------+------------------+------+-----+-------------------+----------------+
| qbsql_id | int(10) unsigned | NO | PRI | NULL | auto_increment |
| TxnID | varchar(40) | YES | MUL | NULL | |
| Customer_ListID | varchar(40) | YES | MUL | NULL | |
| Customer_FullName | varchar(255) | YES | | NULL | |
+--------------------------------+------------------+------+-----+-------------------+----------------+
Table: qb_invoice_invoiceline
+-------------------------+------------------+------+-----+-------------------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------------------------+------------------+------+-----+-------------------+----------------+
| qbsql_id | int(10) unsigned | NO | PRI | NULL | auto_increment |
| Invoice_TxnID | varchar(40) | YES | MUL | NULL | |
| Item_ListID | varchar(40) | YES | MUL | NULL | |
| Item_FullName | varchar(255) | YES | | NULL | |
+-------------------------+------------------+------+-----+-------------------+----------------+
Table: qb_customer
+-------------------------------------+------------------+------+-----+-------------------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------------------------------------+------------------+------+-----+-------------------+----------------+
| qbsql_id | int(10) unsigned | NO | PRI | NULL | auto_increment |
| ListID | varchar(40) | YES | MUL | NULL | |
| Name | varchar(41) | YES | MUL | NULL | |
+-------------------------------------+------------------+------+-----+-------------------+----------------+
给定一个Item_ListID,我希望使用一个快速、高效的查询返回Item_ListID的列表,以及订购列表中每个项目的客户数,其中所有客户都有最初提供的Item_ListID
现在,我有以下SQL可以工作,但速度非常慢:
SELECT qb_invoice_invoiceline.Item_FullName, count(*) as 'nummy'
FROM qb_invoice_invoiceline
WHERE qb_invoice_invoiceline.Invoice_TxnID =
ANY (SELECT qb_invoice.TxnID
FROM qb_invoice
INNER JOIN qb_customer ON qb_invoice.Customer_ListID = qb_customer.ListID
INNER JOIN qb_invoice_invoiceline ON qb_invoice.TxnID = qb_invoice_invoiceline.Invoice_TxnID
WHERE qb_invoice_invoiceline.Item_ListID = '1360000-57')
GROUP BY qb_invoice_invoiceline.Item_ListID
ORDER BY nummy DESC
我感谢你的帮助
以下是“解释”输出:
+----+--------------------+------------------------+-------+---------------------------+-------------+---------+-----------------------------------------+-------+----------------------------------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+--------------------+------------------------+-------+---------------------------+-------------+---------+-----------------------------------------+-------+----------------------------------------------+
| 1 | PRIMARY | qb_invoice_invoiceline | index | NULL | Item_ListID | 123 | NULL | 19690 | Using where; Using temporary; Using filesort |
| 2 | DEPENDENT SUBQUERY | qb_invoice_invoiceline | ref | Invoice_TxnID,Item_ListID | Item_ListID | 123 | const | 8 | Using where |
| 2 | DEPENDENT SUBQUERY | qb_invoice | ref | Customer_ListID,TxnID | TxnID | 123 | func | 206 | Using where |
| 2 | DEPENDENT SUBQUERY | qb_customer | ref | ListID | ListID | 123 | devdb.qb_invoice.Customer_ListID | 18 | Using where; Using index |
+----+--------------------+------------------------+-------+---------------------------+-------------+---------+-----------------------------------------+-------+----------------------------------------------+
如果要加入的varchar字段上没有可用的索引,则查询可能会很慢。你能详细说明这些表上的索引吗
我认为查询将受益于qb_invoice.TxnID和qb_customer.ListID上的索引,以及qb_invoice_invoiceline.Item_ListID上的索引。如果您加入的varchar字段上没有可用的索引,那么查询可能会很慢。你能详细说明这些表上的索引吗
我认为查询将受益于qb_invoice.TxnID和qb_customer.ListID上的索引,以及qb_invoice_invoiceline.Item_ListID上的索引。您可以使用“explain[query]”来分析数据库在MySQL上如何执行查询。此外,将“解释”的结果添加到问题中也很有帮助。查询中的计数使其运行缓慢。如果对查询中的联接进行计数*,则会对每个可能联接中多个表中的所有列进行计数。感谢您的评论。我尝试将COUNT函数更改为使用特定列,但它似乎对速度没有影响。我添加了“解释”输出,请参见上文。您可以使用“解释[query]”分析数据库在MySQL上如何执行查询。此外,将“解释”的结果添加到问题中也很有帮助。查询中的计数使其运行缓慢。如果对查询中的联接进行计数*,则会对每个可能联接中多个表中的所有列进行计数。感谢您的评论。我尝试将计数函数更改为使用特定列,但它似乎对速度没有影响。我添加了“解释”输出,请参见上文。您建议的所有字段都已经是索引。。。还有其他想法吗?你建议的所有字段都已经是索引了。。。还有其他想法吗?