[英]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.