对于我的数据类的最终项目,我试图在一个包含900,000多个事务的数据库中在MySQL中创建一个市场购物篮分析(使用Workbench 6.3 CE和Server 5.7)。
这是我为了得到我需要的东西(一些用于以后的查询)的表格草图...
表:
sales
列:
pos_trans_id INT(11)
basketId VARCHAR(45)
productNumber VARCHAR(25)
productDescription VARCHAR(255)
categoryCode VARCHAR(25)
categoryDescription VARCHAR(255)
subcategoryCode VARCHAR(25)
subcategoryDescription VARCHAR(255)
quantity INT(11)
purchaseAmt DECIMAL(12,2)
dateOfSale INT(11)
这是我一起试图制作我自己的市场购物篮分析版本的查询:
SELECT purchaseone.productNumber, purchaseone.productDescription, purchasetwo.productNumber, purchasetwo.productDescription, purchaseone.basketId
FROM
(SELECT DISTINCT productNumber, productDescription, basketId
FROM sales) AS purchaseone
JOIN
(SELECT DISTINCT productNumber, productDescription, basketId
FROM sales) AS purchasetwo
ON
(
purchaseone.basketId = purchasetwo.basketId AND
purchaseone.productNumber != purchasetwo.productNumber AND
purchaseone.productNumber < purchasetwo.productNumber
);
问题我遇到的问题是查询将运行数小时,数小时和数小时并最终没有给我任何结果,或者在Workbench中可视化它将花费很长时间它是无用的。
有没有人知道我在这里做错了什么,或者我应该采取什么措施来加快速度?提前谢谢。
*编辑:这是您要求的额外背景。 *
到目前为止我创建了两个自定义表:
CREATE TABLE `sales`
(\n `pos_trans_id` int(11) NOT NULL DEFAULT \'0\',
\n `basketId` varchar(45) DEFAULT NULL,
\n `productNumber` varchar(25) DEFAULT NULL,
\n `productDescription` varchar(255) DEFAULT NULL,
\n `categoryCode` varchar(25) DEFAULT NULL,
\n `categoryDescription` varchar(255) DEFAULT \'0\',
\n `subcategoryCode` varchar(25) DEFAULT NULL,
\n `subcategoryDescription` varchar(255) DEFAULT \'0\',
\n `quantity` int(11) DEFAULT NULL,
\n `purchaseAmt` decimal(12,2) DEFAULT NULL,
\n `dateOfSale` int(11) DEFAULT NULL
\n)
ENGINE=InnoDB DEFAULT CHARSET=latin1
CREATE TABLE 'date'
(\n `dateKey` int(11) NOT NULL,
\n `dayOfTheMonth` int(2) DEFAULT NULL,
\n `dayOfTheWeek` int(1) DEFAULT NULL,
\n PRIMARY KEY (`dateKey`)
\n)
\n ENGINE=InnoDB DEFAULT CHARSET=latin1
答案 0 :(得分:1)
从您的查询中,您似乎正在尝试制作一个&#34;也购买了&#34;或&#34;与&#34;一起购买分析类型。 下面的查询应该运行得更快。它消除了查询中的子查询,并简化了任务。
SELECT
a.productNumber,
a.productDescription,
b.productNumber,
b.productDescription,
a.basketId
FROM `purchaseone` a
LEFT JOIN `purchaseone` b
ON a.basketId = b.basketId AND
a.productNumber != b.productNumber AND
a.productNumber < b.productNumber
GROUP BY a.basketId, a.productNumber, b.productNumber