这是一个有点棘手的解释,所以我将尝试列出我要实现的目标:
到目前为止,我已经尝试使用一个查询来实现此目的,使用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和其他查询(我试图避免这种情况)?
我知道我可能会以完全错误的方式来处理此问题,因此欢迎其他方法的建议!
答案 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()
;