2011-01-11 2 views
2

У меня есть этот запроскак присоединиться после левой присоединиться к сложной MySQL запросов

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_i д. Если у него нет branch_id, верните null.

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

Спасибо.

+0

mana kau punya схема? где схема для tb_user? а также, пожалуйста, отступьте ваш sql, вдавливание кода тоже важно – ajreal

+1

Каков желаемый результат? Вы хотите «GROUP BY currency_code, user_id'? или вы хотите повернуть на userid или что? –

+0

Извините, ребята, я обновил вопрос. – cyberfly

ответ

1

Три условия в join (предложения 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 

И, наконец, имена полей с большой крышкой выглядят странно и для моего глаза. Все, что работает для вас.

+0

. Использование' CASE' может показаться вам странным, но это стандартный SQL и выглядит менее странным. меня! –

+0

Не беспокойтесь. У каждого из нас есть свой собственный взгляд на эстетику кодирования. Я уверен, что мой код отвратителен для некоторых и элегантен для других. :-) 'IF' работает в MySQL, но если CASE является стандартным и портативным, то все лучше. – RobertB

1

добавить user_id, чтобы выбрать часть после

 
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 

также Соскучились WHERE (поставил вместо первого и) и

 
GROUP BY currency_code, user_id 
Смежные вопросы