是否存在一个查询,用于选择哪些客户购买了特定产品,以及这些相同客户还购买了哪些其他产品?

时间:2019-04-13 21:54:37

标签: mysql

我有2个表,其中一个表具有交易记录(ProductId | TransactionId | CustomerID),另一个表具有产品描述(ProductId | ProductName)。

我曾尝试使用INNER JOIN,但只设法选择了购买该特定产品的客户。

1 个答案:

答案 0 :(得分:0)

假设您有下表:

mysql> EXPLAIN transactions;
+---------------+------------+------+-----+---------+----------------+
| Field         | Type       | Null | Key | Default | Extra          |
+---------------+------------+------+-----+---------+----------------+
| Id            | bigint(20) | NO   | PRI | NULL    | auto_increment |
| ProductId     | bigint(20) | YES  |     | NULL    |                |
| TransactionId | bigint(20) | YES  |     | NULL    |                |
| CustomerId    | bigint(20) | YES  |     | NULL    |                |
+---------------+------------+------+-----+---------+----------------+

您首先阅读包含所需产品和客户的行:

SELECT
    t.TransactionId
FROM
    transactions t
WHERE
    t.CustomerId = 4 AND
    t.ProductId = 9;

这将生成如下内容:

+---------------+
| TransactionId |
+---------------+
|             7 |
+---------------+

然后,您在同一张表上使用JOIN来获取具有该交易ID的所有行(我在“项目”中使用别名i)。

SELECT
    i.ProductId,
    i.TransactionId,
    i.CustomerId
FROM
    transactions t
JOIN
    transactions i ON t.TransactionId = i.TransactionId
WHERE
    t.CustomerId = 4 AND
    t.ProductId = 9;

您可能会得到如下结果:

+----+-----------+---------------+------------+
| Id | ProductId | TransactionId | CustomerId |
+----+-----------+---------------+------------+
|  1 |         3 |             7 |          4 |
|  2 |         4 |             7 |          4 |
|  3 |         9 |             7 |          4 |
+----+-----------+---------------+------------+

您可以从那里访问/加入products表以获取名称。

请记住,您的表结构不适合3NF。您可能要创建这样的表:

transactions
    - Id
    - CustomerId
    - OrderDate
    - [...]

products
    - Id
    - Name

transactionItems
    - Id
    - TransactionId
    - ProductId
    - Amount (?)