как присоединиться после левого соединения сложных MySQL запросов - PullRequest
2 голосов
/ 11 января 2011

У меня есть этот запрос

SELECT 
       currency_code, 
       SUM(CASE WHEN TYPE = 'buy'THEN to_amount END ) AS BUY, 
       SUM(CASE WHEN TYPE = 'sell' THEN to_amount END ) AS SELL, 
       SUM(CASE WHEN TYPE = 'sell' THEN rate END ) AS SELL_RATE, 
       SUM(CASE WHEN TYPE = 'buy' THEN rate END ) AS BUY_RATE, 
       AVG(CASE WHEN TYPE = 'buy' THEN rate END ) AS AVG_BUY_RATE, 
       AVG(CASE WHEN TYPE = 'sell' THEN rate END ) AS AVG_SELL_RATE
FROM tb_currency
LEFT JOIN tb_bill 
   ON tb_currency.CURRENCY_ID = tb_bill.CURRENCY_ID
     AND tb_bill.TYPE  IN ('buy', 'sell')
     AND date( DATE_TIME ) >= '2011-01-01'
     AND date( DATE_TIME ) <= '2011-01-11'
GROUP BY currency_code

, который выведет это:

alt text

Сейчас я хочу объединить этот запрос с другой таблицей с именем tb_user

tb_user имеет PK с именем user_id , а tb_bill , который используется в запросе выше, также имеет внешний ключ с именем user_id

tb_user

user_id (pk)| user_name | branch_id

tb_bill

bill_id (pk) | user_id (fk)|

Желаемый результат должен быть на картинке выше плюс один столбец branch_id. Если у него нет значения branch_id, вернуть null.

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

Спасибо.

Ответы [ 2 ]

1 голос
/ 11 января 2011

Три условия в объединении (предложения AND) могут создавать проблемы. Эти три условия являются критериями выбора, а не критериями объединения.

Кроме того, ваше использование CASE выглядит странно для меня. Я уверен, что это работает, но если IF лучше подходит для функции с одним условием. Ниже, если поля с плавающей точкой, а не целое число, замените 0 на 0.0.

SELECT currency_code, 
    SUM(IF(TYPE = 'buy', to_amount, 0)) AS BUY,
    SUM(IF(TYPE = 'sell', to_amount, 0)) AS SELL, 
    SUM(IF(TYPE = 'sell', rate, 0)) AS SELL_RATE,
    SUM(IF(TYPE = 'buy', rate, 0)) AS BUY_RATE,
    AVG(IF(TYPE = 'buy', rate, 0)) AS AVG_BUY_RATE,
    AVG(IF(TYPE = 'sell', rate, 0)) AS AVG_SELL_RATE,
    tb_user.whatever_field,
    tb_user.whatever_other_field
FROM tb_currency
    LEFT JOIN tb_bill ON tb_currency.CURRENCY_ID = tb_bill.CURRENCY_ID
    LEFT JOIN tb_user ON tb_bill.user_id = tb_user.user_id
WHERE tb_bill.TYPE IN ('buy', 'sell')
    AND date( DATE_TIME ) >= '2011-01-01'
    AND date( DATE_TIME ) <= '2011-01-11'
GROUP BY currency_code, tb_user.user_id

И, наконец, названия всех заглавных букв также выглядят странно. Все, что работает для вас, хотя.

1 голос
/ 11 января 2011

добавить user_id к части SELECT после

LEFT JOIN tb_bill ON tb_currency.CURRENCY_ID = tb_bill.CURRENCY_ID

место

LEFT JOIN tb_user ON tb_user.id = tb_bill.user_id

также вы пропустили ГДЕ (поставьте вместо первого И) и

GROUP BY currency_code, user_id
...