Node.js &引用;“否定”;SQL(postgres)查询

Node.js &引用;“否定”;SQL(postgres)查询,node.js,postgresql,Node.js,Postgresql,我需要一些SQL查询的帮助。因为我是这个领域的新手,我无法真正解释谷歌我在做什么,我还没有找到任何合适的答案。我的桌子也可以吗 我想接收所有的线程(id,name),它们不是我自己的线程,也不是我已经投票的线程。(即我可以投票) 数据库如下所示: Threads +----+-------------+---------+ | id | thread_name | user_id | +----+-------------+---------+ | 1 | Soccer |

我需要一些SQL查询的帮助。因为我是这个领域的新手,我无法真正解释谷歌我在做什么,我还没有找到任何合适的答案。我的桌子也可以吗

我想接收所有的线程(id,name),它们不是我自己的线程,也不是我已经投票的线程。(即我可以投票)

数据库如下所示:

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);

MySQL还是PostgreSQL?好的,你尝试了什么?@Houari谢谢,我更新了我的post@MarcelSchulze你能不能也给出你的表的模式,例如。\d?@shivams我不确定,你能看看我的更新吗?谢谢你。看起来是这样的。从未想过使用两个select语句。“有可能吗?”我不能肯定地说。我想有一段时间可以编辑您的查询,但无法编辑。所以我就这样重写了。我希望这将推动你完成你的任务,而这最终才是最重要的;)