如何从一个mysql表中获得不同的结果?

时间:2017-08-04 16:16:04

标签: mysql

我在数据库中有一个用户表,用于存储系统的所有用户。 该表具有user_id和business_name以及first_name。 有些用户是商家并获得商家名称, 一些用户是消费者并获得名字。 在第二个表中,我有与user_id和merchant_id(定义交易)和金额的交易。两个ID都引用用户表。

Table users:
user_id bus_name first_name role_id
1               Thomas        10
2      comp1                  7
3               Peter         10
4      comp2                  7
(role_id is defining with 10=consumer, 7=merchant)

Table transactions:
trans_id amount user_id merchant_id
1         12     1         2      
2         23     3         2 
3         34     3         4
4         19     1         4

现在我希望将查询结果作为一个表: 此表应包含具有金额的事务,user_id,first_name,merchant_id和bus_name。

我想得到这个结果:

trans_id amount user_id first_name merchant_id bus_name
1          12     1        Thomas      2         comp1
2          23     3        Peter       2         comp1
3          34     3        Peter       4         comp2
4          19     1        Thomas      4         comp2

我遇到的问题是,我只得到first_name和空bus_name,或者我只得到bus_name但是只有first_name。 我正在使用左连接:

...
left join `users` 
on(
(`transactions`.`user_id` = `users`.`user_id`)
)
...

但是对于这个我会得到user_id = 1 first_name = Thomas而bus_name =''将为空,因为我只引用表中的一行而不是user_id = 2的不同用户。

但我想说的是:

for trans_id=1
get first_name FROM users WHERE transactions.user_id = users.user_id 
AND
get bus_name FROM users WHERE transactions.merchant_id = users.user_id

感谢您的帮助,我尝试了很多东西,但它不起作用。

3 个答案:

答案 0 :(得分:1)

您必须两次加入用户表:

SELECT t.*, u.first_name, m.bus_name
FROM transactions t
JOIN users as u
  ON t.user_id = u.user_id
JOIN users as m
  ON t.merchant_id = m.merchant_id

答案 1 :(得分:0)

您可以在用户表中使用duoble join

select a.trans_id, a.amount , a.user_id,  b.first_name, a.merchant_id, c. bus_name
from transactions a 
inner join users b on a.user_id = b.user_id and b.role_id = 10
inner join users c on a.merchant_id = c.user_id and c.role_id = 7

答案 2 :(得分:0)

加入用户表两次工作正常。使用“left join users作为使用者”我创建了一种名为“consumer”的虚拟用户表,这个表已加入。当然在选择中我也必须调整表名。第二个“虚拟”表od用户也称为“商家”。

select 
`transactions`.`trans_id` AS `trans_id`,
`transactions`.`merchant_id` AS `merchant_id`,
`merchant`.`bus_name` AS `bus_name`,
`transactions`.`user_id` AS `user_id`,
`consumer`.`first_name` AS `first_name`,
`cards`.`card_id` AS `card_id`,
`cards`.`serial_no` AS `serial_no`
from (
         `transactions` 
             left join `cards`
                on(
                    (`cards`.`card_id` = `transactions`.`card_id`)
                  )
             left join `users` as consumer
                on(
                    (`consumer`.`user_id` = `transactions`.`user_id`)
                  )
             left join `users` as merchant
                on(
                    (`merchant`.`user_id` = `transactions`.`merchant_id`)
                  )


    )