0

仕事用の休暇申請ツールを構築しています。

REQUESTS、COVERED、MODID の 3 つのテーブルがあります。

REQUESTS 次のフィールドがあります。

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 に入れられると、MOD の MODID が ID (auto_increment) に設定され、MOD が必要とする TOR THE_DATE とシフトの 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 テーブルのダンプがあります 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 に答える