是否有查询选择哪些客户购买了特定产品以及这些客户购买了哪些其他产品?

问题描述 投票:-1回答:1

我有2个表,一个表上有事务(ProductId | TransactionId | CustomerID),另一个表有产品描述(ProductId | ProductName)。

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

mysql
1个回答
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的所有行(我在“items”中使用别名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 (?)
© www.soinside.com 2019 - 2024. All rights reserved.