Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typo3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 用户案例还是子查询?_Mysql - Fatal编程技术网

Mysql 用户案例还是子查询?

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

我有三张桌子:票、票和用户。我的问题是在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 
    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)