我正在查看this example of joining multiple tables这让我想知道,例如,在购买鼠标之前购买键盘时,您将如何从客户表中选择名称?
我正在尝试类似的方法,但没有成功。
SELECT
product_name, customer.name, date_of_sale
FROM sales, product, customer
WHERE
STR_TO_DATE(
(
SELECT date_of_sale
FROM sales
WHERE product_id = 2
),
STR_TO_DATE('2012-12-23 18:00:00')
>
STR_TO_DATE(
(
SELECT date_of_sale
FROM sales
WHERE product_id = 3
),
STR_TO_DATE('2012-12-23 18:00:00')
最佳答案
我可以想到两种方法来做到这一点。
方法一是使用一元连接
(Sales
到 Sales
,然后到 Customers
)。
方法二是在 View
(或临时表
)中group_concat
加入到客户
。
SQLFiddle:http://sqlfiddle.com/#!2/9a031/22
一元连接
出于提供信息的原因,我包含了所有列。
SELECT c.name,
s1.product_id AS product1,
s1.date_of_sale AS date1,
s2.product_id AS product2,
s2.date_of_sale AS date2
FROM sales s1,
sales s2,
customers c
WHERE s1.date_of_sale < s2.date_of_sale
AND s1.customer_id = s2.customer_id AND
c.customer_id = s1.customer_id and
s1.product_id = 3 AND s2.product_id = 2;
临时表中的Group_concat
SELECT name
FROM customers,
(SELECT customer_id,
group_concat(PRODUCT_ID
ORDER BY date_of_sale)
FROM sales
GROUP BY customer_id HAVING group_concat(PRODUCT_ID
ORDER BY date_of_sale) LIKE '%3,2%') sales_order
WHERE customers.customer_id = sales_order.customer_id;
优点/缺点
分组连接:
- PRO:group_concat 方法支持类似的行中的多个值,例如
喜欢“%3,2,10%”
- 缺点:对于较小的产品表,速度较慢并且使用临时内存表。
加入:
- PRO:数据量较小时速度更快。
- CON:需要在联接中为 +1 个产品添加 +1 个销售表。
- 缺点:数据量越大,速度可能会越慢
关于mysql - 仅在先购买另一种产品后才获取该产品?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24639106/