MySQL SELECT FROM 3表用哪里

时间:2018-05-20 13:34:22

标签: mysql sql

我有3张桌子:

任务:

ID   | UID  | PID   | TITLE    |
1    | 2    | 0     | task 1   |
2    | 2    | 1     | task 1-1 |
3    | 3    | 0     | task 2   |
4    | 2    | 0     | task 3   |
5    | 2    | 0     | task 4   |

TODO:

ID   | UID  | TXID   | TID      | TITLE    |
1    | 2    | 1      | 1        | todo1    |
2    | 2    | 1      | 1        | todo2    |
3    | 3    | 2      | 3        | todo3    |
4    | 2    | 4      | 4        | todo4    |
5    | 2    | 5      | 5        | todo5    |

timix:

ID   | UID  | STATUS   | 
1    | 2    | 0        |
2    | 2    | 1        |
3    | 3    | 0        | 
4    | 2    | 1        | 
5    | 2    | 0        |

我需要声明看起来像这个查询但更正了:

SELECT * 
FROM todo,task,timix 
WHERE task.id = todo.tid 
  AND todo.uid=2 
  AND task.pid=0 
  AND timix.id = todo.txid 
  AND timix.status = 0

这是变量的描述:

uid = user id
txid = timix id
tid = task id
pid = parent id

我需要:   show tasks有todo`s和pid = 0,uid = 2,timix_status = 0

3 个答案:

答案 0 :(得分:0)

您可能想要加入但使用EXISTS吗?至少我是如何理解你的#34;我需要"。

SELECT *
       FROM task
       WHERE task.pid = 0
             AND EXISTS (SELECT *
                                FROM todo
                                WHERE todo.tid = task.id
                                      AND todo.uid = 2
                                      AND EXISTS (SELECT *
                                                         FROM timix
                                                         WHERE timix.id = todo.txid
                                                               AND timix.status = 0));

或者您可能希望将连接保留在子查询中。

SELECT *
       FROM task
       WHERE task.pid = 0
             AND EXISTS (SELECT *
                                FROM todo
                                     INNER JOIN timix
                                                ON timix.id = todo.txid
                                WHERE todo.tid = task.id
                                      AND todo.uid = 2
                                      AND timix.status = 0);

另一种选择可能是:

SELECT DISTINCT task.* FROM todo,task,timix WHERE task.id = todo.tid AND todo.uid=2 AND task.pid=0 AND timix.id = todo.txid AND timix.status = 0;

DISTINCT重复推算结果。 (但请考虑使用明确的JOIN语法而不是FROM table1, table2 WHERE table1.attribute1 = table2.attribute2变体。它更容易看出明确的语法含义。)

这取决于您的系统(数据,索引)哪一个表现最佳。

答案 1 :(得分:0)

简单,

Select t.* from Task t join
todo td on t.ID = td.TID join
timix tx on td.TXID = tx.ID
where t.UID = 2 and tx.STATUS = 0

答案 2 :(得分:0)

由于您未提供预期结果,我不确定您到底需要什么。

这是我的方法

http://sqlfiddle.com/#!9/ec3c88/2

SELECT * 
FROM task
INNER JOIN todo
ON task.id = todo.tid 
  AND todo.uid=2 
INNER JOIN timix 
ON timix.id = todo.txid 
  AND timix.status = 0
WHERE task.pid=0

但它返回与原始查询相同的设置。那么这个结果有什么不对?你想要排除什么记录?或者添加?