我有一个purchases表,我试图选择名字、姓氏和电子邮件都是重复的所有行(对于所有3个)。
采购表:
| purchase_id | product_id | user_id | firstname | surname | email |
| ------------- | -----------| ------------- | ----------- | --------- | ----------- |
| 1 | 1 | 777 | Sally | Smith | s@gmail.com |
| 2 | 2 | 777 | Sally | Smith | s@gmail.com |
| 3 | 3 | 777 | Sally | Smith | s@gmail.com |
| 4 | 1 | 888 | Bob | Smith | b@gmail.com |
除此之外,每个产品id对应于“products”表中的一个产品类型,我尝试按“割草机”购买进行筛选(因此只有产品id 1和2)
产品表:
| product_type | product_id |
| ------------- | -----------|
| lawnmower | 1 |
| lawnmower | 2 |
| leafblower | 3 |
我希望编写一个查询,返回“割草机”类型的所有购买,其中名字、姓氏和电子邮件是重复的(因此将返回purchases表的前两行)。
到目前为止,这就是我的查询所处的位置,但是它没有返回准确的数据(例如,我知道我有大约350个重复项,它返回10000行):
SELECT t. *
FROM database_name.purchases t
JOIN (
SELECT firstname, surname, email, count( * ) AS NumDuplicates
FROM database_name.purchases
GROUP BY firstname, surname, email
HAVING NumDuplicates >1
)tsum ON t.firstname = tsum.firstname
AND t.surname = tsum.surname
AND t.email = tsum.email
INNER JOIN database_name.products p2 ON t.product_id = p2.product_id
WHERE p2.product_type = 'lawnmower'
只是想知道我需要在查询语法中调整什么。
2条答案
按热度按时间7uzetpgm1#
你知道你应该还萨莉·史密斯。根据上面的查询结果创建一个表。然后从first\u name=sally,lasname=smith的表中选择*。看看你能不能据此找出你的错误所在。这将帮助您在将来自己调试这些类型的问题。
llew8vvj2#
你的内心
SELECT
不筛选产品类型。它能让所有购买过任何两种商品的顾客都能买到。然后你加入到purchases
因此,客户也可以购买任何两件物品,可能只有一件,割草机。在子查询中的产品类型上也添加筛选器:你的模式也有问题——非规范化。
firstname
,surname
以及email
依靠user_id
(请注意,我仅使用user_id
,够了,)。所以他们不应该进来purchases
,仅限user_id
.product_type
最好是通过一个id引用一些产品类型表。