“Negative”SQL(postgres)查询

我需要一些SQL查询的帮助。 因为我是这个领域的新手,所以我无法真正解释Google所要做的事情,但是我没有find任何正确的答案。 甚至可以用我的桌子?

我想收到所有的线程(id,名称),这不是我自己的线程,哪些不是我已经投票。 (即线程我可以投票)

数据库看起来像这样:

Threads +----+-------------+---------+ | id | thread_name | user_id | +----+-------------+---------+ | 1 | Soccer | 1 | | 2 | Running | 1 | | 3 | Swimming | 2 | +----+-------------+---------+ User +----+--------+ | id | name | +----+--------+ | 1 | Marcel | | 2 | Marc | | 3 | Susy | +----+--------+ Votes +----+-----------+---------+ | id | thread_id | user_id | +----+-----------+---------+ | 1 | 1 | 3 | | 2 | 1 | 2 | | 3 | 2 | 3 | +----+-----------+---------+ 

例:

  • 如果用户1进行查询,他应该收到线程3,因为它不是他自己的,他还没有投票。
  • 用户2应该收到线程2
  • 用户4应该收到所有的线程

我试过了:

 SELECT DISTINCT t.id, name FROM threads as t LEFT JOIN votes as v ON v.thread_id = t.id WHERE (v.user_id != USER_ID OR v.user_id IS NULL) AND t.user_id != USER_ID 

我正在使用Sequelize(Node.js ORM)。 pgAdmin给我以下(简化)作为架构 – 希望这有助于:

 -- Table: "threads" -- DROP TABLE "threads"; CREATE TABLE "threads" ( id serial NOT NULL, name character varying(255), "createdAt" timestamp with time zone NOT NULL, "updatedAt" timestamp with time zone NOT NULL, "user_id" integer, CONSTRAINT "threads_pkey" PRIMARY KEY (id), CONSTRAINT "threads_user_id_fkey" FOREIGN KEY ("user_id") REFERENCES "users" (id) MATCH SIMPLE ON UPDATE CASCADE ON DELETE SET NULL ) WITH ( OIDS=FALSE ); ALTER TABLE "threads" OWNER TO postgres; -- Table: "votes" -- DROP TABLE "votes"; CREATE TABLE "votes" ( id serial NOT NULL, "createdAt" timestamp with time zone NOT NULL, "updatedAt" timestamp with time zone NOT NULL, "user_id" integer, "thread_id" integer, CONSTRAINT "votes_pkey" PRIMARY KEY (id), CONSTRAINT "votes_thread_id_fkey" FOREIGN KEY ("thread_id") REFERENCES "threads" (id) MATCH SIMPLE ON UPDATE CASCADE ON DELETE SET NULL, CONSTRAINT "votes_user_id_fkey" FOREIGN KEY ("user_id") REFERENCES "users" (id) MATCH SIMPLE ON UPDATE CASCADE ON DELETE SET NULL ) WITH ( OIDS=FALSE ); ALTER TABLE "votes" OWNER TO postgres; -- Table: "users" -- DROP TABLE "users"; CREATE TABLE "users" ( id serial NOT NULL, username character varying(255), "createdAt" timestamp with time zone NOT NULL, "updatedAt" timestamp with time zone NOT NULL, CONSTRAINT "users_pkey" PRIMARY KEY (id) ) WITH ( OIDS=FALSE ); ALTER TABLE "users" OWNER TO postgres; 

谢谢。

这应该可以解决你的问题。

 select t.id from threads as t where t.user_id != USER_ID and t.id not in (select v.thread_id from votes as v where v.user_id = USER_ID);