我正在为工作构建一个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。
答案 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
试试这个!