0

我正在为工作构建一个休假请求工具。

我有 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

当在 REQUESTS 中提出休假请求时,会使用 ID (auto_increment) 填充 mod 的 MODID,并将其放入 TOR THE_DATE 中,mod 需要覆盖和他们的班次的 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';

我遇到的问题是我想获取所有请求的模块列表,这些模块的请求涵盖了他们的请求的日期和时间以及涵盖班次 EG 的模块的名称

请求的 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。

4

2 回答 2

1

Since you are only seeking out the ones with coverage, you don't NEED left joins and you should hopefully have FK Constraints in place to keep the mod lookups from breaking. This will give you what you want, with the additional second join of the MODID table giving you the covering mod's name.

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

I would highly suggest you change the table structure to store the CMODID to the actual integer ID of the mod as your table structure is convoluted.

于 2013-02-22T21:38:46.647 回答
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

试试这个!

于 2013-02-22T20:45:20.410 回答