簡體   English   中英

Oracle SQL聯接/合並2個表並按ID分組/排序以創建類似Facebook的時間軸

[英]Oracle SQL to join / union 2 tables and group / sort by ID to create facebook-like timeline

對於一部分課程,我必須創建一個類似Facebook的應用程序。

目前,我正在“時間軸”頁面上工作,並努力應對所需的SQL查詢的復雜性。

我期望的結果是在單個表格和組或排序中顯示帖子和回復,以便回復位於相應帖子的下方

eg post_id        text
     1          First post
     1          Response 1 to post 1
     1          Response 2 to post 1
     2          Second post
     2          Response 1 to post 2
     2          Response 2 to post 2

數據庫架構如下:

create or replace type post_obj as object (
   post_id number,
   post_text varchar2(500),
   user_posted_by ref user_obj,
   post_date timestamp,
   map member function get_postid return number) not final;

create table post_obj_tbl of post_obj;


create or replace type response_obj as object (
   response_id number,
   response_text varchar2(500),
   post_details ref post_obj,
   user_posted_by ref user_obj,
   response_date timestamp,
   map member function get_responseid return number) not final;

create table response_obj_tbl of response_obj;

到目前為止,我設法將兩個表連接在一起,以便獲得一個顯示帖子和回復的表,但該表會自動按用戶ID進行分組。 這是查詢:

SELECT p_tbl.user_posted_by.username, p_tbl.post_text, p_tbl.post_date
FROM post_obj_tbl p_tbl

WHERE 

p_tbl.user_posted_by.user_id = (
   SELECT u_tbl.user_id
   FROM user_obj_tbl u_tbl 
   WHERE u_tbl.username = (select V('APP_USER') from DUAL) )

OR

p_tbl.user_posted_by.user_id in (
   SELECT f_tbl.friend_id 
   FROM friends_obj_tbl f_tbl
   WHERE f_tbl.user_id = (
      SELECT u_tbl.user_id
      FROM user_obj_tbl u_tbl 
      WHERE u_tbl.username = (select V('APP_USER') from DUAL) )
   )

UNION
SELECT r_tbl.user_posted_by.username, r_tbl.response_text, r_tbl.response_date
FROM response_obj_tbl r_tbl, post_obj_tbl p_tbl
WHERE r_tbl.post_details.post_id = p_tbl.post_id;

我真的希望這是有道理的...我的頭很亂! 任何幫助表示贊賞:)

首先,為什么要創建對象表? 通常的方法是創建這樣的表:

create table post_obj  (
   post_id number,
   post_text varchar2(500),
   user_posted_by number,
   post_date timestamp);

使用此類表要容易得多,尤其是在APEX中。
關於查詢。 我將參與其中:

SELECT p_tbl.user_posted_by.username, p_tbl.post_text, p_tbl.post_date
FROM post_obj_tbl p_tbl
WHERE 
p_tbl.user_posted_by.user_id = (
   SELECT u_tbl.user_id
   FROM user_obj_tbl u_tbl 
   WHERE u_tbl.username = (select V('APP_USER') from DUAL) )

可以將其轉換為:

SELECT p_tbl.user_posted_by.username, p_tbl.post_text, p_tbl.post_date
FROM   post_obj_tbl p_tbl,
       user_obj_tbl u_tbl
WHERE  p_tbl.user_posted_by = u_tbl.user_id
   AND u_tbl.username = V('APP_USER')

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM