mysql внутреннее соединение, дающее плохие результаты (?) - PullRequest
1 голос
/ 16 июня 2011

Следующий вызов 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 ]

2 голосов
/ 16 июня 2011

Возможно ли наличие нескольких записей для Customer_ID в таблицах customer_emails или customer_phone_numbers?

1 голос
/ 16 июня 2011

Я не совсем уверен, так как я не могу проверить это, но может произойти следующее.

Если на одного клиента приходится более одного адреса электронной почты или номера телефона, конечный результат может быть увеличен из-за новых объединений.

Представьте себе запрос без group_by и присоединитесь к продажам:

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

У пользователя в этом примере 2 почтовых адреса.

Если бы вы сейчас добавили объединение в продажи и группу по, вы бы удвоили total_retail.

Если это так, замена ЛЕВОГО СОЕДИНЕНИЯ на ЛЕВОЕ НАРУЖНОЕ СОЕДИНЕНИЕ должна помочь. Однако в этом случае вы увидите только первый адрес электронной почты / номер телефона клиента.

1 голос
/ 16 июня 2011

У вас будет слишком много записей.Попробуйте выполнить запрос без предложения group by, и вы увидите, какие и как.Скорее всего, левые объединения будут дублировать строки заказа при каждом совпадении электронной почты / телефона клиента.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...