2015-02-06 59 views
1

這是當前融化我的大腦的一種方式,但必須有一種方法可以做到這一點。基本上查詢看起來是這樣的:要求記錄存在,如果它們存在於mysql的另一個表中

SELECT r.* FROM records r 
JOIN users u ON u.job_id = r.job_id 
LEFT JOIN records_requirements rr ON rr.record_id = r.id 
INNER JOIN user_requirements ur on ur.requirement_id = rr.requirement_id 

所以基本上我想要做的是說讓所有具有相同作業ID的用戶時,如果記錄有要求,如果用戶只選擇它們記錄在user_requirements表中具有匹配記錄。如果用戶沒有要求,則不要選擇記錄。

因此,獲取所有具有相同job_id且沒有要求的記錄,或者具有相同的job_id並且沒有任何用戶沒有的要求。

+0

有點像需求ID =記錄ID – 2015-02-06 22:20:05

+0

我猜你需要一個反連接,一個'WHERE等等是NULL'檢查 – Mihai 2015-02-06 22:24:09

+0

像'WHERE(rr.requirement_id IS NULL或ur.requirement_id IS NOT NULL) '?如果有多個rr.requirement_ids,這會工作嗎?即使它有一堆記錄要求,我仍然只想拉一條記錄。 – PixMach 2015-02-06 22:27:47

回答

1

沒有測試它,我覺得這樣的事情應該工作:

SELECT DISTINCT r.* 
FROM records r 
INNER JOIN users u ON u.job_id = r.job_id 
LEFT JOIN records_requirements rr ON rr.record_id = r.id 
LEFT JOIN user_requirements ur ON ur.requirement_id = rr.requirement_id 
    AND ur.user_id = u.id 
WHERE 
    (
    (rr.record_id IS NULL) 
     OR 
    (rr.record_id IS NOT NULL AND ur.requirement_id IS NOT NULL) 
) 
    AND u.id = ? 

它在做什麼是左側的接合部記錄的要求,以允許任何要求,而且還那麼左側的接合部,以用戶的需求,這樣的記錄與要求,但沒有匹配的用戶要求仍然被拉。

然後,使用where測試來允許空記錄要求,或記錄和用戶要求均已到位。

最後,SELECT DISTINCT用於確保每個記錄只能得到一個結果。

編輯:一個快速測試使用SQL Server如下:

DECLARE @Users TABLE (job_id int) 
DECLARE @Records TABLE (id int, job_id int) 
DECLARE @Records_Requirements TABLE (requirement_id int, record_id int) 
DECLARE @User_Requirements TABLE (requirement_id int) 

INSERT INTO @Users VALUES (1) 

INSERT INTO @Records VALUES (1, 1) 
INSERT INTO @Records VALUES (2, 1) 
INSERT INTO @Records VALUES (3, 1) 

INSERT INTO @Records_Requirements VALUES (1, 1) 
INSERT INTO @Records_Requirements VALUES (2, 2) 

INSERT INTO @User_Requirements VALUES (2) 

SELECT DISTINCT r.* 
FROM @Records r 
INNER JOIN @Users u ON u.job_id = r.job_id 
LEFT JOIN @Records_Requirements rr ON rr.record_id = r.id 
LEFT JOIN @User_Requirements ur on ur.requirement_id = rr.requirement_id 
WHERE (rr.record_id IS NULL) OR (rr.record_id IS NOT NULL AND ur.requirement_id IS NOT NULL) 

了:

id job_id 
2 1 
3 1 

我認爲這是測試數據正確。也許MySQL的工作方式不同,但它不應該。

+0

我實際上是這樣做的,但是如果沒有record_requirement會失敗,大概是因爲LEFT JOIN沒有看到任何rr.requirement_id。編輯:它顯示記錄,如果record_requirement存在,並且用戶需求存在並匹配,則顯示不匹配,如果rr.requirement_id不爲空和你的。然而,requirement_id應該是null。 – PixMach 2015-02-06 23:06:29

+1

我已經使用SQL Server做了一個快速測試(我沒有MySQL),它似乎按預期工作。你能夠提供一個簡短的腳本來創建一些測試數據嗎? (我會將我的SQL測試粘貼到我的答案中以供參考)......或者您能否提供一些測試數據和預期結果? – Alan 2015-02-06 23:59:38

+0

我花了很多時間試圖找出它爲什麼不起作用,結果原因不是我想的,原因是ur.requirement_id不必與特定用戶(應該有包括我正在查找與特定用戶相匹配的記錄),因此需要添加一種鏈接到特定用戶的方式。有'ur.user_id =?'被打破了,所以我不得不將一個子句移動到ON子句,除非你知道一個方法來做'WHERE ur.user_id =?或者ur.user_id是null'或者where子句中的東西,但這看起來很危險。 – PixMach 2015-02-07 15:18:20

相關問題