使用MySQL从最近的文章中随机选择“特色”文章,如果不存在,则返回

使用MySQL从最近的文章中随机选择“特色”文章,如果不存在,则返回,mysql,Mysql,这是一个有点棘手的解释,所以我将尝试列出我试图实现的目标: 我在一个页面上输出新闻文章,由最新的first排序。 有些文章在数据库中被标记为“赞助商”。 在一行4篇文章中,我想包括多达2篇随机出现的赞助文章,即非固定位置 赞助文章不区分日期,因此可以在任何时间发布。 如果没有找到赞助文章,我只想显示最近的4篇文章。 到目前为止,我已经尝试了一个查询来实现这一点,使用UNION对2个不同的结果进行分组,然后对整个批次进行随机排序 我目前的查询如下: SELECT * FROM ( (

这是一个有点棘手的解释,所以我将尝试列出我试图实现的目标:

我在一个页面上输出新闻文章,由最新的first排序。 有些文章在数据库中被标记为“赞助商”。 在一行4篇文章中,我想包括多达2篇随机出现的赞助文章,即非固定位置 赞助文章不区分日期,因此可以在任何时间发布。 如果没有找到赞助文章,我只想显示最近的4篇文章。 到目前为止,我已经尝试了一个查询来实现这一点,使用UNION对2个不同的结果进行分组,然后对整个批次进行随机排序

我目前的查询如下:

SELECT * FROM
(
    (
        SELECT * 
        FROM articles
        WHERE sponsored = 0             
        ORDER BY publish_at DESC 
        LIMIT 2
)
UNION
(
    SELECT * 
    FROM articles
    WHERE sponsored = 1   
    ORDER BY RAND() 
    LIMIT 2
    )
) TEMP
ORDER BY RAND()
当有2篇赞助文章时,这很好地工作,但是如果没有,我只会得到查询所建议的2篇最新文章

这听起来可能在一个查询中实现,还是应该添加一些条件PHP和我试图避免的进一步查询


我知道我可能会以完全错误的方式来处理这个问题,所以请接受其他方法的建议

您可以选择4种有机物品,因此您可以选择最多6种,然后从中筛选。在PHP中执行这些操作可能会更容易一些,因为这可能会变得有点复杂,但这是可行的

假设表结构如下:

CREATE TABLE
`articles`
(
  `article_id` INT PRIMARY KEY AUTO_INCREMENT,
  `content` TEXT,
  `sponsored` TINYINT(1) DEFAULT 0,
  `publish_at` DATETIME
);

INSERT INTO
  `articles`
(`content`, `sponsored`, `publish_at`)
VALUES
('Article 1', 0, '2018-06-25'),
('Article 2', 0, '2018-06-25'),
('Article 3', 0, '2018-06-25'),
('Article 4', 0, '2018-06-25'),
('Article 5', 1, '2018-06-25'),
('Article 6', 1, '2018-06-25'),
('Article 7', 1, '2018-06-25'),
('Article 8', 1, '2018-06-25');
您可以执行以下操作:

SELECT * FROM (
  SELECT * FROM (
    SELECT
      *
    FROM
      `articles`
    WHERE
      `sponsored` = 0
    ORDER BY 
      `publish_at` DESC
    LIMIT 4
  ) AS OrganicArticles
  UNION
  SELECT * FROM
  (
    SELECT
      *
    FROM
      `articles`
    WHERE
      `sponsored` = 1
    ORDER BY 
      RAND()
    LIMIT 2
  ) AS SponsoredArticles
  ORDER BY 
    `sponsored` DESC
  LIMIT 4
  ) AS AllArticles
ORDER BY
  RAND()
;

我不知道这是否有效,但我想到的第一件事可能是首先查询赞助文章,将计数*作为重复,并使用4-重复来确定其他文章的限制。。。某些东西嵌套查询某些东西。。。还没想清楚:太好了,谢谢!正是我想要的: