【问题标题】:riddle? MYSQL - LIMIT in subquery using JOIN. Want to delete all posts except minimum 100 posts per category but some posts in several categories谜语? MYSQL - 使用 JOIN 限制子查询。想要删除所有帖子,每个类别至少 100 个帖子,但多个类别中的一些帖子
【发布时间】:2021-10-05 06:19:38
【问题描述】:

你好,使用 mysql8 (8.0.23) 的 wordpress:

我想删除除每个类别至少 100 个帖子之外的所有帖子。 所以在前端,我希望点击任何类别以显示至少 100 个帖子。

这似乎很容易,除非许多帖子存在于多个类别中。

所以对于 A 类,如果我删除所有 >100 的帖子,那么第 112 行的帖子可能也存在于 B 类中,但只是第 80 行,因此会被删除。

看到谜底了吗?

所以在测试中使用 4 个类别,我该怎么做

  • 删除 A 类帖子 >100
  • 但在 B 类中不
  • 但在 C 类中不
  • 但在 D 类中不

对于下面的示例,类别 A、B、C、D 的 ID (71,72,73,74) 在子查询中使用 LIMIT(必须使用 JOIN,因为子查询中不允许使用 LIMIT?)


SELECT * FROM wp_posts
 
    JOIN 
    (
        SELECT ID 
        FROM wp_posts 
        WHERE NOT 
        (wp_posts.ID IN ( SELECT object_id FROM wp_term_relationships WHERE term_taxonomy_id IN (72) ) ) 
        LIMIT 100
    ) d
    ON wp_posts.ID 
    IN (d.ID)
    
    JOIN 
       (
        SELECT ID 
        FROM wp_posts 
        WHERE NOT 
        (wp_posts.ID IN ( SELECT object_id FROM wp_term_relationships WHERE term_taxonomy_id IN (73) ) ) 
         LIMIT 100
         ) e
        ON wp_posts.ID 
        IN (e.ID)
   
    JOIN 
       (
        SELECT ID 
        FROM wp_posts 
        WHERE NOT 
        (wp_posts.ID IN ( SELECT object_id FROM wp_term_relationships WHERE term_taxonomy_id IN (74) ) ) 
         LIMIT 100
         ) f
        ON wp_posts.ID 
        IN (f.ID)

 
  WHERE 
        (wp_posts.ID IN ( SELECT object_id FROM wp_term_relationships WHERE term_taxonomy_id IN (71) ) ) 
        AND (wp_posts.post_type = 'post' ) 
GROUP BY wp_posts.ID 
ORDER BY wp_posts.post_date DESC
LIMIT 99999999
OFFSET 100

它有零行

感谢您的帮助!

【问题讨论】:

  • SELECT VERSION(); 报告什么?回答这个问题的人可能想知道您是否可以使用窗口函数。
  • @BillKarwin 哦,它的 MySQL 8.0.23
  • add a row_number window function and partion it b 100
  • 请不要在不可读的评论中发布任何代码。此外,您的 Row_number 只有一个按日期排列的顺序,但它还需要一个 PaRTITION BY,这是您想要数百个的类别

标签: mysql wordpress join subquery limit


【解决方案1】:

解决了..但没有使用 LIMIT 和 JOIN。

感谢@nbk 的评论,我改用ROW_NUMBER() OVER。这在子查询中是允许的。我在这里将其作为“选择”语句而不是删除(用于测试)。

在此处使用四个类别,类别 ID 为 71、72、73 和 74。

SELECT wp_posts.*
FROM  wp_posts 
   
WHERE 

(wp_posts.post_type = 'post' AND wp_posts.post_status = 'publish')   
   
AND

-- posts discluded if under 100 most recent per category:
(

( wp_posts.ID NOT IN (SELECT ID FROM (SELECT ID, ROW_NUMBER() OVER (ORDER BY wp_posts.post_date DESC) AS rownumber
  FROM wp_posts
  WHERE (wp_posts.ID IN (SELECT object_id FROM wp_term_relationships WHERE term_taxonomy_id IN (71) ) ) 
AND (wp_posts.post_type = 'post' AND wp_posts.post_status = 'publish')  
) AS foo
WHERE rownumber <= 100
) 
)

AND

( wp_posts.ID NOT IN (SELECT ID FROM (SELECT ID, ROW_NUMBER() OVER (ORDER BY wp_posts.post_date DESC) AS rownumber
  FROM wp_posts
  WHERE (wp_posts.ID IN (SELECT object_id FROM wp_term_relationships WHERE term_taxonomy_id IN (72) ) ) 
AND (wp_posts.post_type = 'post' AND wp_posts.post_status = 'publish')  
) AS foo
WHERE rownumber <= 100
) 
)

AND

( wp_posts.ID NOT IN (SELECT ID FROM (SELECT ID, ROW_NUMBER() OVER (ORDER BY wp_posts.post_date DESC) AS rownumber
  FROM wp_posts
  WHERE (wp_posts.ID IN (SELECT object_id FROM wp_term_relationships WHERE term_taxonomy_id IN (73) ) ) 
AND (wp_posts.post_type = 'post' AND wp_posts.post_status = 'publish')  
) AS foo
WHERE rownumber <= 100
) 
)

AND

( wp_posts.ID NOT IN (SELECT ID FROM (SELECT ID, ROW_NUMBER() OVER (ORDER BY wp_posts.post_date DESC) AS rownumber
  FROM wp_posts
  WHERE (wp_posts.ID IN (SELECT object_id FROM wp_term_relationships WHERE term_taxonomy_id IN (74) ) ) 
AND (wp_posts.post_type = 'post' AND wp_posts.post_status = 'publish')  
) AS foo
WHERE rownumber <= 100
) 
)

)


【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-01-19
    • 1970-01-01
    • 1970-01-01
    • 2019-10-24
    • 1970-01-01
    • 1970-01-01
    • 2012-01-20
    • 1970-01-01
    相关资源
    最近更新 更多