0

その中にplayersテーブルとhostフィールドを取得しました。またbans、次のフィールドで呼び出される 2 番目のテーブルも取得しました: hostsecond_hostip。かどうかを確認する必要がありplayersます。hostcontent フィールドは、テーブル内のこれら 3 つのフィールドのいずれとも等しくありません。条件は 1 つです: .bansWHERE expiry >= UNIX_TIMESTAMP()

私はすでにこれを構築しましたが、ご覧のとおり、BAN テーブルには 3 つの条件があり、今何をすべきかわかりません。

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

ここで、他の 3 つのフィールド (second_hostおよびip) についても同じことを行う必要があります。1回のクエリでそれを行うことは可能ですか? もしそうなら、例を投稿してください。

4

3 に答える 3

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()); 
于 2012-05-17T12:29:47.420 に答える
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 結合について学習します。

于 2012-05-17T12:23:15.100 に答える
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....)
于 2012-05-17T12:23:34.100 に答える