簡體   English   中英

MySQL參考外部表別名在子查詢錯誤

[英]MySQL reference outer table alias in subquery error

  select c.*
    from posts p
    join comments c on (p.id=c.post_id) 
        and c.status = 'A' 
        and c.id >= (select MIN(id) from (select id from comments where post_id=p.id order by id DESC LIMIT 7) as c2)
    where p.comments_count > 0 AND p.id IN (247,245,244,243,242,241)

在上面的sql查詢中,我在“ where子句”中得到此mysql錯誤Unknown列“ p.id”,似乎在子查詢p.id中無法引用。 無論如何,我可以獲得在此子查詢中引用的posts表ID?

您只能訪問1級深的外部查詢。 因此,嘗試對中間查詢執行過濾器:

SELECT MIN(id)
FROM (
    SELECT id, post_id 
    FROM   comments 
    ORDER  BY id DESC 
    LIMIT  7
)
WHERE post_id = p.id 

我認為您正在嘗試獲取每個帖子的最新7條評論。 你可以試試這個嗎? 您可以在這里測試http://www.sqlfiddle.com/#!2/a222e/3/0

第一次嘗試

我嘗試下面的SQL。

SELECT *
FROM comments t1
WHERE post_id IN (247,254,244,243,242,241)
AND id IN (
    SELECT id
    FROM comments
    WHERE t1.id = id
    LIMIT 7
);

但是我收到一個錯誤“此版本的MySQL尚不支持'LIMIT&IN / ALL / ANY / SOME子查詢”

另一種方法

因此,我嘗試對注釋進行自我連接以生成序列號。

SELECT id
FROM (
    SELECT t1.id, COUNT(*) AS cnt
    FROM comments t1 INNER JOIN comments t2
      ON t1.post_id = t2.post_id
    WHERE t1.id <= t2.id
      AND t1.post_id IN (247,254,244,243,242,241)
      AND t2.post_id IN (247,254,244,243,242,241)
    GROUP BY t1.id
) x
WHERE cnt <= 7;

內部子查詢使用自我連接並產生cnt列,該列具有每個帖子id的順序值。

但是之前的查詢僅獲取評論的id

最后,要獲取注釋表的所有列,應執行以下查詢。

SELECT *
FROM comments c INNER JOIN (
    SELECT id
    FROM (
        SELECT t1.id, COUNT(*) AS cnt
        FROM comments t1 INNER JOIN comments t2
          ON t1.post_id = t2.post_id
        WHERE t1.id <= t2.id
          AND t1.post_id IN (247,254,244,243,242,241)
          AND t2.post_id IN (247,254,244,243,242,241)
        GROUP BY t1.id
    ) x
    WHERE cnt <= 7
) t USING (id);

使用用戶變量

實際上,您還有另一個使用MySQL user variable機會。 我沒有提到這個有趣的MySQL功能,因為我不確定我是否正確理解了您的問題。

SELECT * 
FROM (
    SELECT post_id, id,
        IF (@pid = post_id, @cnt := @cnt + 1, @cnt := 1) AS cnt,
        @pid := post_id
    FROM comments, (SELECT @pid := 0, @cnt := 0) tmp
    WHERE post_id IN (247,254,244,243,242,241)
    ORDER BY post_id, id DESC
) x
WHERE cnt <= 7;

與舊的聯接版本相比,前置SQL看起來更簡單(意味着性能更好)。 但未經大數據集測試。

暫無
暫無

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

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