2014-01-18 91 views
0

我有一個使用MySQL的遊戲。我試圖展示最終遊戲分數列表,並且此列表應該排除用戶阻止的任何人。 下面是表的結構:需要幫助,排除MySQL中連接表中的某些行

table_game 
------------ 
table_id int 
person_id int 
person_nom varchar(25) 
finalscore int 
scoretime datetime 

table_blocked 
-------------- 
table_id int 
person_id int 
person_id_blocked int 

比方說,我爲person_id是 '1',我已經拒絕爲person_id '5'(所以有一排table_blocked用的table_id = 1,爲person_id = 1,person_id_blocked = 5)。 這意味着我不應該在我的結果中看到person_id'5'。

這裏的查詢,但爲person_id「5」是自我表現在:

SELECT 
    f.table_id, 
    f.person_id as fID, 
    f.person_nom AS fNOM, 
    f.finalscore AS fFINAL, 
    f.scoretime AS fTIME, 
    table_blocked.table_id, 
    table_blocked.person_id, 
    table_blocked.person_id_blocked 
FROM 
    table_game f 
    LEFT OUTER JOIN table_blocked ON f.person_id = table_blocked.person_id 
WHERE (
    (fFINAL > 0) 
    AND ((table_blocked.person_id_blocked != '5') OR (table_blocked.person_id_blocked IS NULL)) 
) 
ORDER BY fTIME DESC 
LIMIT 5 

我在做什麼錯?

+0

考慮提供適當的DDL和/或sqlfiddle連同所需的結果集 – Strawberry

+0

的SQL不即使在寫法上語法上也是正確的。 'ffinal'是一個列別名,所以它不能在'where'子句中被引用(或者數據結構通過具有該名稱的列以及與該名稱相混淆的列而超級混淆)。 –

+0

謝謝 - 我是一名PHP程序員和MySQL新手。不知道WHERE子句中不允許使用別名。 – user3184415

回答

0

嗯,是的。我覺得寫的查詢更清晰的方式是:

SELECT f.table_id, f.person_id as fID, f.person_nom AS fNOM, f.finalscore AS fFINAL, 
     f.scoretime AS fTIME, table_blocked.table_id, table_blocked.person_id, 
     tb.person_id_blocked 
FROM table_game f 
WHERE f.person_id not in (select person_id_blocked from table_blocked) and 
     f.finalscore > 0 

這則變成:

SELECT f.table_id, f.person_id as fID, f.person_nom AS fNOM, f.finalscore AS fFINAL, 
     f.scoretime AS fTIME, table_blocked.table_id, table_blocked.person_id, 
     tb.person_id_blocked 
FROM table_game f LEFT OUTER JOIN 
    table_blocked tb 
    ON f.person_id = tb.person_id_blocked 
WHERE tb.person_id_blocked is null and 
     f.finalscore > 0; 
+0

謝謝!如果他們的person_id_blocked = 5,你能不能請一個特別排除一個人的例子?這個查詢是從PHP頁面調用的,所以我可以動態插入person_id_blocked的數量。 – user3184415

+0

@ user3184415。 。 。如果你知道被阻止的人*,那麼只需包含「personid <> $ blockedpersonid'。你根本不需要加入表格。 –

+0

我很欣賞你的意見。我必須加入2張牌桌,因爲我正在顯示比賽的分數列表。 table_game包含用戶的信息,比如他們的ID號和遊戲的分數,另一個表table_blocked需要加入,這樣如果用戶阻止了其他用戶,被阻止的用戶將無法看到阻止他們的人的分數。我試過person_id_blocked!= 5(原始發佈的查詢),但它不起作用。 – user3184415