mysql内连接给出不好的结果(?)

时间:2011-06-16 13:29:58

标签: mysql sql vb.net left-join inner-join

以下sql调用正常,为客户返回正确的总零售量:

SELECT  customer.id,
        customer.first_name, 
        customer.last_name,
        SUM(sales_line_item_detail.retail) AS total_retail
FROM sales_line_item_detail
    INNER JOIN sales_header 
        ON sales_header.id = sales_line_item_detail.sales_header_id
    INNER JOIN customer 
        ON customer.id = sales_header.customer_id
GROUP BY sales_header.customer_Id
ORDER BY total_Retail DESC
LIMIT 10

但是,我需要它来返回客户的电话和电子邮件地址..请记住,并非所有客户都有电子邮件地址和电话号码。每当我离开加入电子邮件和数字表时,它会将total_retail金额减少数千,我不知道为什么。

以下查询为total_retail字段提供了完全错误的结果:

    SELECT  customer.id,
        customer.first_name, 
        customer.last_name,
        IF(
            ISNULL( gemstore.customer_phone_numbers.Number), 
            'No Number..', 
            gemstore.customer_phone_numbers.Number
            ) AS Number,
        IF(
            ISNULL(gemstore.customer_emails.Email), 
            'No Email...', 
            gemstore.customer_emails.Email
            ) AS Email,
        SUM(sales_line_item_detail.retail) AS total_retail,
FROM sales_line_item_detail
    INNER JOIN sales_header 
        ON sales_header.id = sales_line_item_detail.sales_header_id
    INNER JOIN customer 
        ON customer.id = sales_header.customer_id
    LEFT JOIN gemstore.customer_emails 
        ON gemstore.customer_emails.Customer_ID = gemstore.customer.ID
    LEFT JOIN gemstore.customer_phone_numbers 
        ON gemstore.customer_phone_numbers.Customer_ID = gemstore.customer.ID
GROUP BY sales_header.customer_Id
ORDER BY total_Retail DESC
LIMIT 10

非常感谢任何帮助,弄清楚它为什么会抛弃我的结果。

谢谢!

3 个答案:

答案 0 :(得分:2)

customer_emails或customer_phone_numbers表中是否有多条Customer_ID记录?

答案 1 :(得分:1)

您将匹配太多记录。尝试不带group by子句的查询,你会看到哪些以及如何。很可能左连接将在每个客户电子邮件/电话匹配上重复订单行。

答案 2 :(得分:1)

我不完全确定,因为我无法测试这一点,但可能会发生以下情况。

如果每个客户有多个电子邮件或电话号码,最终结果可能会成倍增加,因为新的联接。

想象一下没有group_by的查询并加入销售:

CustomerId    Email          phoneNumber
1             test@gmx.com   0122233
1             mail@yahoo.com 0122233

此示例中的用户有2个mailadresses。

如果您现在将联接添加到sales和group by,则会使total_retail加倍。

如果是这种情况,用LEFT OUTER JOIN替换LEFT JOIN应该可以解决问题。在这种情况下,您只会看到客户的第一个电子邮件/电子邮件。