SQL如何合并选择项并排除其中之一?

时间:2019-07-13 12:32:07

标签: mysql sql select union

起初,我想选择前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
)

此类查询没有行作为结果。

任何建议将不胜感激,谢谢!

2 个答案:

答案 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

我不确定您的查询是否确实满足您的要求,因为您可能会得到很多重复的行。