多对多关系,以确定用户是否喜欢帖子

时间:2018-02-28 22:41:18

标签: sql postgresql

我有一张包含所有帖子的表格。我还有一个表,当用户喜欢带有外键user_id和post_id的帖子时,会添加一行。

我想检索帖子的所有列表,以及特定用户是否喜欢该帖子。使用外部联接我最终得到一些帖子两次。一次为用户1,一次为用户2.如果我使用WHERE过滤likes.user_id = 1 AND likes.user_id为NULL我没有得到只有其他用户喜欢的帖子。

理想情况下,我会使用单个查询执行此操作。 SQL不是我的优势,所以我甚至不确定是否需要子查询或者连接是否足够。

对于这种含糊不清的道歉,但我认为这是一个很常见的问题,它应该是有道理的。

编辑:我用我提到的两个查询创建了一个DB Fiddle。 https://www.db-fiddle.com/f/oFM2zWsR9WFKTPJA16U1Tz/4

更新:昨晚搞清楚了。这就是我最终的结果:

library(dplyr)
library(shiny)
library(lubridate)

df = data.frame(location, date = as_datetime(date),latitude,longitude,pm25,pm10,no2)

ui = fluidPage(
  dateInput('date',
            label = 'First Available Date',
            value = min(df$date)
  )   ,
  dateInput('date2',
            label = 'Last available Date',
            value = max(df$date)
  ),
  submitButton(text = "Submit", icon = NULL, width = NULL),
  shiny::dataTableOutput("merged") 
)

server = function(input, output, session) {
  output$merged <- shiny::renderDataTable({
    df %>%
      filter(as_date(date) >= input$date, as_date(date) <= input$date2)
  })
}

shinyApp(ui = ui, server = server)

虽然我能够解决它,但感谢@wildplasser的回答。

2 个答案:

答案 0 :(得分:2)

数据(我需要稍微更改一下,因为不应该分配给连续出版物):

 CREATE TABLE posts (
  id serial,
  title varchar
);

CREATE TABLE users (
  id serial,
  name varchar
);

CREATE TABLE likes (
  id serial,
  user_id int,
  post_id int
);

INSERT INTO posts (title) VALUES ('First Post');
INSERT INTO posts (title) VALUES ('Second Post');
INSERT INTO posts (title) VALUES ('Third Post');

INSERT INTO users (name) VALUES ('Obama');
INSERT INTO users (name) VALUES ('Trump');

INSERT INTO likes (user_id, post_id) VALUES (1, 1);
INSERT INTO likes (user_id, post_id) VALUES (2, 1);
INSERT INTO likes (user_id, post_id) VALUES (2, 2);
-- I want to retrieve a list of ALL of the posts and whether or not a specific user has liked that post
SELECT id, title
        , EXISTS(
                --EXISTS() yields a boolean value
                SELECT *
                FROM likes lk
                JOIN users u ON u.id = lk.user_id AND lk.post_id=p.id
                WHERE u.name ='Obama'
                ) AS liked_by_Obama
FROM posts p
        ;

结果:

 id |    title    | liked_by_obama 
----+-------------+----------------
  1 | First Post  | t
  2 | Second Post | f
  3 | Third Post  | f
(3 rows)

答案 1 :(得分:0)

据我了解,您有两个表,例如帖子表,其中包含来自不同用户的所有帖子以及包含user.idpost id的相似表格。如果你想只翻阅帖子那么

select * from posts

如果您还需要用户信息,这可以在user表中找到,那么您可以在下面进行操作。

select user.user_name, post.postdata from user,post where post.userid=user.userid

在上面的查询中,user_nameuser表中的列名,postdatapost表中的列。