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

时间:2018-06-26 12:51:33

标签: php mysql

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

  1. 我要在页面上输出新闻报道,按最新的顺序排列。
  2. 某些文章在数据库中被标记为“赞助”。
  3. 我希望在连续的4篇文章中包括最多2个随机出现的赞助商(即非固定职位)
  4. 赞助的文章不区分日期,因此可以随时出现。
  5. 如果没有找到赞助文章,我只想显示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和其他查询(我试图避免这种情况)?

我知道我可能会以完全错误的方式来处理此问题,因此欢迎其他方法的建议!

1 个答案:

答案 0 :(得分:3)

您可以选择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()
;

http://www.sqlfiddle.com/#!9/0138f0/11