Mysql 用户案例还是子查询?
我有三张桌子:票、票和用户。我的问题是在users表中有两种类型的用户:请求者和解决者:类型1和2。 我想选择票据,请求者(如果有的话)可以是多个,解算器(如果有的话)可以是多个 我的想法是:Mysql 用户案例还是子查询?,mysql,Mysql,我有三张桌子:票、票和用户。我的问题是在users表中有两种类型的用户:请求者和解决者:类型1和2。 我想选择票据,请求者(如果有的话)可以是多个,解算器(如果有的话)可以是多个 我的想法是: SELECT t.id, t.description, (u.id where u.type = 1) AS requester, (u.id where u.type = 2) AS solver FROM tickets t INNER JOIN t
SELECT
t.id, t.description,
(u.id where u.type = 1) AS requester,
(u.id where u.type = 2) AS solver
FROM
tickets t
INNER JOIN
tickets_users tu ON t.id = tu.ticket_id
INNER JOIN
users u ON tu.user_id = u.id
显然,这是行不通的
这些表如下所示:
门票:
ID Description
1 Description 1
2 Description 2
门票和用户
ID Ticket_ID User_id Type
1 3 4 1
2 5 8 2
使用者
谢谢
同时,我认为我在join子句中找到了一个使用子查询的解决方案,但对我来说,它看起来很初级:
SELECT
t.id, t.name AS ticket_name, type1.users_id AS requester,
type2.users_id AS solver
FROM
tickets t
INNER JOIN
(SELECT users_id, tickets_id
FROM tickets_users
WHERE TYPE = 1) type1 ON t.id = type1.tickets_id
INNER JOIN
(SELECT users_id, tickets_id
FROM tickets_users
WHERE TYPE = 2) type2 ON t.id = type2.tickets_id
应该是这样的
SELECT
t.id, t.description, u.id, userType
CASE WHEN u.type = 1 THEN 'requester' ELSE 'solver' END
FROM
tickets t
INNER JOIN tickets_users tu ON t.id = tu.ticket_id
INNER JOIN users u ON tu.user_id = u.id
请提供sqlfiddle,以防上述示例不起作用
加入,
SELECT
t.id, t.description, requesters.id, solvers.id
FROM
tickets t
INNER JOIN tickets_users tu ON t.id = tu.ticket_id
LEFT JOIN users requesters ON (tu.user_id = requesters.id AND requesters.type=1)
LEFT JOIN users solvers ON (tu.user_id = solvers.id AND solvers.type=2)
正如您所知道的,users表是作为请求者和作为具有附加条件的解算者加入的。使用左联接的原因是,如果有一条记录没有请求者或解算器,则内部联接将完全忽略整个记录,直到它有一个请求者和解算器。将表联接两次,或者在以下情况下使用MAXCASE。。。然后ENDThaks,我想这是可行的,但这不是我想要的结果。我想将users表中的Type列分成两列:一列用于请求者,另一列用于求解者。类似这样的东西:TicketID,TicketDescription,RequesterID,SolverID。我没有左连接?哪张桌子是连接的?只有一个users表,用户是请求者或求解者,具体取决于类型。检查添加的解释。刚刚看到,您可能需要重新考虑内部联接,以及您的sql有2个子查询+2个联接这一事实,这对于此任务来说有点过分。同意。加入2个子查询将非常缓慢。
SELECT
t.id, t.description, requesters.id, solvers.id
FROM
tickets t
INNER JOIN tickets_users tu ON t.id = tu.ticket_id
LEFT JOIN users requesters ON (tu.user_id = requesters.id AND requesters.type=1)
LEFT JOIN users solvers ON (tu.user_id = solvers.id AND solvers.type=2)