多个表之间的多个连接

时间:2013-02-22 20:37:01

标签: mysql left-join inner-join outer-join

我正在为工作构建一个Time off requests工具。

我有3个表:REQUESTS,COVERED和MODID。

要求具有以下字段:

ID INT Auto_Increment not null Primary Key
MODID VARCHAR(7) not null
THE_DATE DATE not null
THE_TIME VARCHAR(30) not null
COVERED CHAR(1) not null Default = 'N'

COVERED具有以下字段:

ID INT not null Primary Key
CMODID VARCHAR(7) not null

最后,MODID包含以下字段:

MODID VARCHAR(7) not null Primary Key
MODNAME VARCHAR(40) not null

当在请求中放入一个休假请求填充ID(auto_increment)时,mod的MODID放在TOR THE_DATE,mod需要covere和THE_TIME。

我有一个PHP后端构建,输入上面的数据。同一个后端,当有人拿起一个班次时,将REQUESTS.ID添加到COVERED.ID和覆盖班次的mod的MODID。然后它为该特定班次设置REQUESTS.COVERED =“Y”。

我可以使用以下内容获得所有具有活动时间请求的MODS列表:

SELECT M.MODNAME, R.THE_DATE, R.THE_TIME
FROM REQUESTS R
INNER JOIN MODID M ON M.MODID = R.MODID WHERE COVERED = 'N';

我遇到的问题是我想获得所有mod的列表,其请求被覆盖了他们的请求的日期和时间以及覆盖班次EG的mod的名称

请求的MODNAME日期时间包含MODNAME

这就是我的尝试:

SELECT M.MODNAME, R.THE_DATE, R.THE_TIME, C.CMODID
FROM REQUESTS R, COVERED C 
INNER JOIN MODID M ON M.MODID = R.MODID 
INNER JOIN MODID M ON M.MODID = C.CMODID
WHERE COVERED = 'N';

我知道上面的MySQL有很多错误,但是我被困住了,不知道该怎么办。

这是我的MYSQL表的DUMP https://dl.dropbox.com/u/12531574/TOR_2013-02-22.sql

修改

我能收到的最新消息

使用:

SELECT R.MODID, R.THE_DATE, R.THE_TIME, C.CMODID
FROM REQUESTS R
INNER JOIN COVERED C ON C.ID = R.ID;

输出:

MODID   THE_DATE    THE_TIME    CMODID
AKH3    2013-02-28  10:00AM - 1:00PM PST    TST3

我想要做的就是将AKH3(MODID)更改为MODID表中相应的MODNAME,将TST3(CMODID)更改为MODID表中相应的MODNAME。

2 个答案:

答案 0 :(得分:1)

由于你只是寻找有覆盖的那些,你不需要左连接,你应该希望有FK约束来保持mod查找不被破坏。这将为您提供您想要的东西,MODID表的附加第二次连接为您提供封面mod的名称。

SELECT M.MODNAME, R.THE_DATE, R.THE_TIME, CM.MODNAME AS `MOD COVERING NAME`
FROM REQUESTS R
JOIN MODID M ON R.MODID = M.MODID
JOIN COVERED C ON C.ID = R.ID
JOIN MODID CM ON CM.MODID = C.CMODID

我强烈建议您更改表结构,以便在表结构复杂时将CMODID存储到mod的实际整数ID。

答案 1 :(得分:0)

SELECT M.MODNAME, R.THE_DATE, R.THE_TIME, C.CMODID
FROM MODID M
LEFT JOIN REQUESTS R ON R.MODID = M.MODID
AND R.COVERED = 'N';
LEFT JOIN COVERED C ON C.CMODID = M.MODID

试试这个!