PostgreSQL - 根据另一个表从一个表中选择

时间:2016-08-10 07:18:28

标签: postgresql hibernate

我有一个推文表(@OneToMany)和另一个analyzetweets表(@ManyToOne)和' n' tweet表中每个条目的analyzetweets数量(每个分析师一个)。从本质上讲,我可以拥有任意数量的分析师(在表格中表示),每个人只能分析一次推文。为了使它更复杂一些,推文表中的条目按进程分组,由另一个表表示。

我的问题是,如果给定一个特定的process_id和analyst_id,我将如何在最后一个条目中查询analyzetweet表中的tweet_id,然后使用它来查找tweet表中的下一条推文,同时给出相同的process_id和analyst_id?基本上,我想向分析师提供他/她尚未在该特定流程(运行)中分析的下一条推文。

以下是我的表格:

CREATE TABLE tweet (
        id SERIAL PRIMARY KEY,
        process_id INTEGER NOT NULL REFERENCES process(id) ON DELETE CASCADE ON UPDATE CASCADE,
        ...
);


CREATE TABLE analyzedtweet (
        id SERIAL PRIMARY KEY,
        tweet_id INTEGER NOT NULL REFERENCES tweet(id) ON DELETE CASCADE ON UPDATE CASCADE,
        analyst_id INTEGER NOT NULL REFERENCES analyst(id) ON DELETE CASCADE ON UPDATE CASCADE,
        process_id INTEGER NOT NULL REFERENCES process(id) ON DELETE CASCADE ON UPDATE CASCADE,
        ...
);


CREATE TABLE process (
        id SERIAL PRIMARY KEY,
        ...
);


CREATE TABLE analyst (
        id SERIAL PRIMARY KEY,
        ...
);

我知道如何执行此操作的唯一方法分为两步:

  • 给定一个特定的process_id(processId)和analyst_id(analystId)运行以下查询,以便为我提供该分析师在该过程中分析的最后一条tweet_id。

SELECT tweet_id from analyzedtweet WHERE analyzedtweet.analyst_id = analystId AND analyzedtweet.process_id = processId ORDER BY analyzedtweet.tweet_id DESC LIMIT 1

  • 获取上述查询的结果(参考ask latestTweetId)并运行以下查询:

SELECT * from tweet WHERE tweet.id > latestTweetId AND tweet.process_id = processId ORDER BY tweet.id DESC LIMIT 1

我确信有更好的方法可以通过JOIN做到这一点,我无法弄清楚如何。

最后,我正在使用Hibernate并希望恢复POJO。

1 个答案:

答案 0 :(得分:0)

如果您要获取给定process_id的最新推文,并且analyzetweet_id使用此查询:

List<Tweet> t = session.createQuery("select t from tweet t
           join t.process p,t.analyzedtweet a
           where p.id=? and a.id=? order by t.id desc")
            .setParameter(1, process_id)
            .setParameter(2, analyzedtweet_id)
            .setMaxResults(1).getResultList();