起初,我想选择前5行的掠夺性最高。
SELECT
e.id embed_id,
e.type embed_type,
e.embed,
IF(ul.embed_id IS NULL,0,1) liked,
(SELECT COUNT(*) FROM user_likes ula WHERE ula.embed_id = e.id) u_likes
FROM `embeds` e
LEFT JOIN user_likes ul ON ul.embed_id = e.id AND ul.user_id = 1
ORDER BY u_likes DESC
LIMIT 5
然后我想选择其他按ID排序的行,不包括之前选择的前5行。
SELECT
e.id embed_id,
e.type embed_type,
e.embed,
IF(ul.embed_id IS NULL,0,1) liked,
(SELECT COUNT(*) FROM user_likes ula WHERE ula.embed_id = e.id) u_likes
FROM `embeds` e
LEFT JOIN user_likes ul ON ul.embed_id = e.id AND ul.user_id = 1
ORDER BY embed_id
/* HOW TO EXCLUDE FIRTS SELECTION ? */
然后我想结合这两个选择。
如何先将一个彼此排除,然后再合并在一起?可以使用临时表吗?
我也尝试过WHERE NOT EXISTS
,但它不起作用:
SELECT
e.id embed_id,
e.type embed_type,
e.embed,
IF(ul.embed_id IS NULL,0,1) liked,
(SELECT COUNT(*) FROM user_likes ula WHERE ula.embed_id = e.id) u_likes
FROM `embeds` e
LEFT JOIN user_likes ul ON ul.embed_id = e.id AND ul.user_id = 1
WHERE NOT EXISTS (
SELECT
e.id embed_id,
(SELECT COUNT(*) FROM user_likes ula WHERE ula.embed_id = e.id) u_likes
FROM `embeds` e
LEFT JOIN user_likes ul ON ul.embed_id = e.id AND ul.user_id = 1
ORDER BY u_likes DESC
LIMIT 5
)
此类查询没有行作为结果。
任何建议将不胜感激,谢谢!
答案 0 :(得分:1)
能否请您在下面的查询中检查此设置是否达到目的-
SELECT *,CASE WHEN (@rownum := @rownum + 1) < 6 THEN @rownum ELSE 6 END
FROM
(
SELECT
e.id embed_id,
e.type embed_type,
e.embed,
IF(ul.embed_id IS NULL,0,1) liked,
(SELECT COUNT(*) FROM user_likes ula WHERE ula.embed_id = e.id) u_likes
FROM `embeds` e
LEFT JOIN user_likes ul ON ul.embed_id = e.id AND ul.user_id = 1
ORDER BY (SELECT COUNT(*) FROM user_likes ula WHERE ula.embed_id = e.id) DESC
)B,
(SELECT @rownum:=0) AS foo
ORDER BY CASE WHEN (@rownum := @rownum + 1) < 6 THEN @rownum ELSE 6 END
,embed_id
答案 1 :(得分:0)
您可以将OFFSET 5
与巨大的LIMIT
一起用于第二个查询。然后重新排序UNION集:
(
SELECT 1 as top5,
e.id embed_id,
...
FROM `embeds` e ...
ORDER BY u_likes DESC
LIMIT 5
) UNION ALL (
SELECT 0 as top5,
e.id embed_id,
...
FROM `embeds` e ...
ORDER BY u_likes DESC
LIMIT 99999999999999999999,
OFFSET 5
)
ORDER BY top5 DESC, embed_id
由于u_likes
可能有联系,所以内部ORDER BY子句将是不确定的。您应该在两个表中附加主键列,以使顺序确定。像
ORDER BY u_likes DESC, e.id, ula.id
我不确定您的查询是否确实满足您的要求,因为您可能会得到很多重复的行。