Ich habe folgende Tabellen:

  CREATE TABLE ips(
    ip TEXT PRIMARY KEY,    
    blocked INTEGER(1) DEFAULT 0
  );
  
  CREATE TABLE acc(
    ip TEXT NOT NULL,
    time INTEGER(4) DEFAULT (CAST(strftime('%s','now') AS INT)),
    FOREIGN  KEY(ip) REFERENCES ips(ip) ON DELETE CASCADE  
  );  

Wie kann ich eine Listen-IP aus der ersten Tabelle abrufen, der blocked = 1 und 0 zugeordnete Zeilen in den "acc" -Tabellen zugeordnet sind?

SELECT ip FROM ips WHERE blocked = 1 AND ...

1
Alex 19 Aug. 2020 im 13:44

2 Antworten

Beste Antwort

Sie können den linken äußeren Join verwenden.

Beispiel: Wählen Sie * aus ips a linker äußerer Join nach b auf a.ip = b.ip, wobei a.blocked = 0 und b.ip null ist

2
DingDing 19 Aug. 2020 im 10:49

Sie können NOT EXISTS verwenden:

select i.* from ips i
where i.blocked = 1
and not exists (select 1 from acc a where a.ip = i.ip)

Oder wenn Sie nur die Spalte ip möchten, verwenden Sie EXCEPT:

select ip from ips where blocked = 1
except
select ip from acc
2
forpas 19 Aug. 2020 im 10:57