首頁  >  問答  >  主體

主查詢和子查詢 - 子查詢未傳回所需結果

<p>我有以下用於評論系統的SQL查詢。</p>
SELECT
    `main`.`comment_id`,
    `主要`.`評論`,
    `主要`.`時間戳`,
    `main`.`replay_comment_id`,
    COUNT(`重播`.`comment_id`) AS 重播
FROM `posts_comments` AS `main`
左連線 `posts_comments` AS `replay` ON `replay`.`replay_comment_id` = `main`.`comment_id`
在哪裡
    `main`.`post` = "107" AND (`main`.`replay_comment_id` 為 NULL 或 `main`.`comment_id` in ( SELECT
            `posts_comments`.`comment_id`
        從
            `貼文留言`
        在哪裡
            `posts_comments`.`replay_comment_id` = `main`.`comment_id` ) )
透過...分組
    `main`.`comment_id`
訂購依據
    `main`.`comment_id` ASC;
; <p>使用下列資料庫結構與內部值:</p>
|--------
|列|類型|空|預設
|------
|//**評論 ID**//|int(10)|否|
|帖子|int(10)|否|
|作者|int(10)|否|
|replay_comment_id|int(10)|是|NULL
|時間戳|int(10)|否|
|評論|varchar(200)|否|

== 轉儲表 posts_comments 的數據
|19|107|12|NULL|1688801931|評論 1
|20|107|12|NULL|1688801995|評論 2
|21|107|13|20|1688801995|測試評論2的1則評論
|22|107|12|20|1688801995|測試評論2的評論2
|23|107|12|222|1688801995|測試其他評論的 1 則評論
; <p>期望的結果將返回ID為19和20的評論,因為它們是主要評論,以及ID為21和22的評論因為,它們是ID為20的評論的子評論。不宜返回ID為23的評論。現在的查詢只回傳主要評論。</p><p>在子查詢中,如果我將main.comment_id替換為20,我可以獲得我想要的結果,但是如果使用main.comment_id ,則無法得到結果,我無法理解為什麼。對於任何評論和想法,都不會勝感激。</p>
P粉505917590P粉505917590428 天前354

全部回覆(1)我來回復

  • P粉521013123

    P粉5210131232023-07-25 13:32:08

    這個方法行不通。 19和20滿足main.replay_comment_id IS NULL,但在21的子查詢中,posts_comments.replay_comment_id = 19,這並沒有提供任何結果。因此,子評論21和22沒有被選中。

    請檢查以下查詢,看看是否能為您提供結果。


    SELECT 
                  p1.`comment_id`,
                  p1.`comment`,
                  p1.`timestamp`,
                  p1.`replay_comment_id`,
                  (
                    CASE
                      WHEN p1.`replay_comment_id` IS NULL THEN 1 
                      WHEN p1.`replay_comment_id` IN (SELECT DISTINCT comment_id FROM posts_comments) THEN 1 
                      ELSE 0 
                    END
                  ) relationFlg,
                  SUM(1- ISNULL(p2.`comment_id`)) hasChild 
                FROM
                  `posts_comments` p1 
                  LEFT JOIN `posts_comments` p2 
                    ON p1.`comment_id` = p2.`replay_comment_id` 
                GROUP BY 1 
                HAVING relationFlg = 1 
                ORDER BY 1 ;

    回覆
    0
  • 取消回覆