mysql-跨3列选择重复项并与另一个表连接以进行筛选

hmmo2u0o  于 2021-06-20  发布在  Mysql
关注(0)|答案(2)|浏览(280)

我有一个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'

只是想知道我需要在查询语法中调整什么。

7uzetpgm

7uzetpgm1#

你知道你应该还萨莉·史密斯。根据上面的查询结果创建一个表。然后从first\u name=sally,lasname=smith的表中选择*。看看你能不能据此找出你的错误所在。这将帮助您在将来自己调试这些类型的问题。

llew8vvj

llew8vvj2#

你的内心 SELECT 不筛选产品类型。它能让所有购买过任何两种商品的顾客都能买到。然后你加入到 purchases 因此,客户也可以购买任何两件物品,可能只有一件,割草机。在子查询中的产品类型上也添加筛选器:

SELECT t.* 
       FROM database_name.purchases t
            INNER JOIN (SELECT purchases.userid
                               FROM database_name.purchases
                                    INNER JOIN database_name.products
                                               ON products.product_id = purchases.product_id
                               WHERE products.product_type = 'lawnmower'
                               GROUP BY userid
                               HAVING count(*) > 1) s
                       ON t.user_id = s.user_id
            INNER JOIN database_name.products p
                       ON t.product_id = p.product_id
       WHERE p.product_type = 'lawnmower';

你的模式也有问题——非规范化。 firstname , surname 以及 email 依靠 user_id (请注意,我仅使用 user_id ,够了,)。所以他们不应该进来 purchases ,仅限 user_id . product_type 最好是通过一个id引用一些产品类型表。

相关问题