2015-06-10 45 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