2015-06-10 49 views
2

我需要一个SQL查询的一些帮助。因为我是这个领域的新手,所以我无法真正解释Google所要做的事情,但我还没有找到任何正确的答案。我的桌子甚至有可能吗?“负” SQL(Postgres的)查询

我想收到的所有线程(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; 

谢谢。

+0

MySQL或PostgreSQL? – Houari

+0

@Houari PostgreSQL的 –

+0

好了,是什么?你试试? – Houari

回答

1

这应该解决您的问题。

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

谢谢。看起来它正在以这种方式工作。从来没有想过使用两个select语句。一个人甚至有可能吗? –

+0

@MarcelSchulze我无法确定。我想了一会儿来编辑你的查询,但无法做到。所以我重写它这样。我希望这会在你的任务中带你前进,这是最终的结果;) – shivams