2012-05-17 56 views
0

多場我players表和host領域,我也拿到了第二個表稱爲bans具有以下字段:hostsecond_hostip。我需要檢查是否playershost內容字段爲而不是等於bans表中的這三個字段中的任何字段,其中一個條件爲:WHERE expiry >= UNIX_TIMESTAMP()檢查如果一個字段的內容是不是在其他表

我已經建立了這一個,但正如你所看到的,禁止表中有三個條件,現在我不知道該怎麼做。現在

SELECT * FROM players 
WHERE host NOT IN (
     SELECT host 
     FROM bans 
     WHERE expires >= UNIX_TIMESTAMP() 
) 

我不得不對其他三個領域(second_hostip)這樣做。這可以在一個查詢中完成嗎?如果是這樣,請發表一個例子。

回答

1

這是最容易做到這一點的連接條件:

SELECT players.* 
FROM players 
    LEFT JOIN bans 
    ON players.host IN (bans.host, bans.second_host, bans.ip) 
    AND (bans.expires >= UNIX_TIMESTAMP() OR bans.expires = -1) 
WHERE bans.PK IS NULL; -- use primary key from bans table in place of PK 

瞭解SQL joins

+0

是啊,點很好,但是這個人是選擇'only'該禁止的玩家,而我想跳過選擇它們,到期時只選擇那些沒有被放逐(使低於UNIX_TIMESTAMP或禁止表中存在一行)。 – Cyclone

+0

@Cyclone:看到我修改後的答案。 – eggyal

+0

工程就像一個魅力,但我想添加另一個條件放逐permament,所以當'expires'設置爲'-1'時,它不會選擇我嘗試過的播放器:'AND bans.expires> = UNIX_TIMESTAMP ()或bans.expires = -1',但失敗(不在結果中選擇任何行)。你能否添加最後的條件? – Cyclone

0
SELECT * FROM players 
WHERE host NOT IN (
    SELECT host FROM bans WHERE expires >= UNIX_TIMESTAMP() 
    UNION 
    SELECT second_host from bans WHERE expires >= UNIX_TIMESTAMP() 
    UNION 
    SELECT ip from bans WHERE expires >= UNIX_TIMESTAMP() 
) 

或者

SELECT * from players 
WHERE host not in (SELECT host.....) 
AND host not in (SELECT second_host....) 
AND host not in (SELECT ip....) 
+0

聯盟是非常糟糕的想法,你正在掃描三次禁止表。 –

1
SELECT * 
FROM players 
WHERE NOT EXISTS (SELECT 1 
        FROM bans 
        WHERE (players.host = bans.host 
          OR players.host = bans.second_host 
          OR players.host = bans.ip) 
          AND bans.expires >= Unix_timestamp()); 
相關問題