按日期排序,直到到达特定日期,然后按ID DESC排序

罗伯特

基本上,我有一个网站,可以为高级用户提供更好的搜索功能排名,然后其他用户将追随高级用户:

CREATE TABLE IF NOT EXISTS `mlisting` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `cid` int(11) NOT NULL,
  `title` varchar(255) NOT NULL,
  `price` decimal(9,2) NOT NULL,
  `images` text NOT NULL,
  `live` tinyint(1) NOT NULL DEFAULT '1',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=5 ;

INSERT INTO `mlisting` (id, cid, title, price, images, live) VALUES 
(1, 1, 'title 1', 29.99, '', 1),
(2, 2, 'title 2', 69.99, '', 1),
(3, 2, 'title 3',  1.99, '', 1),
(4, 1, 'title 4', 48.99, '', 1);

CREATE TABLE IF NOT EXISTS `companies` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `trust` datetime NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=3 ;

INSERT INTO `companies` (id, trust) VALUES 
(1, '1970-01-01 00:00:00'),(2, '2019-01-01 00:00:00');

因此,查询应搜索premiumdate> = todaysdate (高级到期日)的位置,然后再找不到更多结果,然后使用表中的其余内容。

我已经尝试了UNION,但是按订单排序不起作用,高级用户没有获得优先列表。

到目前为止,这是我的查询:

(
SELECT 
m.id, m.cid, m.title, m.price, m.images, c.trust 
FROM 
mlisting m 
LEFT JOIN 
companies c 
ON (m.cid = c.id) 
WHERE c.trust >='{$itsToday}' AND m.live=1 
ORDER BY m.id DESC
) 
UNION 
(
SELECT 
mo.id, mo.cid, mo.title, mo.price, mo.images, co.trust 
FROM 
mlisting mo 
LEFT JOIN 
companies co ON (mo.cid = co.id) 
WHERE co.trust='1970-01-01 00:00:00' AND mo.live=1 
ORDER BY mo.id DESC
)

感谢您的关注,并希望我朝着正确的方向发展。

这是一个SQL Fiddle,用以显示我所说的ORDER BY不起作用的含义:SQL Fiddle

暴风雨

当您进行选择的并集时,最后的ORDER BY将对组合的结果集进行排序。

因此,您可以简化它:

SELECT m.id, m.cid, m.title, m.price, m.images, c.trust 
FROM mlisting m 
JOIN companies c ON (m.cid = c.id) 
WHERE m.live = 1 
  AND c.trust >= current_date 

UNION ALL

SELECT m.id, m.cid, m.title, m.price, m.images, c.trust 
FROM mlisting m
LEFT JOIN companies c ON (m.cid = c.id) 
WHERE m.live = 1 
  AND nullif(c.trust,'1970-01-01 00:00:00') is null

ORDER BY (case when c.trust >= current_date then 0 else 1 end), id DESC

请注意,使用的是UNION ALL,而不是UNION。因为当两个选择之间的日期不重叠时,不需要丢弃重复项。

后记:

这也可以在没有UNION ALL的情况下完成。
由于可以将不同的日期条件添加到单个SELECT中。

SELECT m.id, m.cid, m.title, m.price, m.images, c.trust 
FROM mlisting m 
LEFT JOIN companies c ON (c.id = m.cid) 
WHERE m.live = 1
  AND
  (     c.trust >= current_date
     OR c.trust = '1970-01-01 00:00:00'
     OR c.trust IS NULL
  )
ORDER BY (case when c.trust >= current_date then 0 else 1 end), id DESC

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

按日期排序并选择直到达到特定ID

按日期时间 DESC 排序

按ID排序,然后按日期排序,然后删除日期较早的行?

按日期时间排序,然后按日期分组

按每个ID的最大日期排序,然后按相同的ID排序其他记录,然后按其最大日期排序其他ID

(Django)按desc排序

如何按日期对查询结果进行排序,然后按MySQL中的特定列值排序

如何按空字符串 ASC 然后按 ID DESC 排序

如何先按属性值然后按日期排序

过滤然后按日期对对象数组进行排序

MySQL排序日期,然后按零件号

SQLAlchemy核心:按desc排序

按DESC反向结果排序

查询按DESC排序的优化

按desc排序似乎失败

按名称然后按日期对数据框进行排序,同时保持名称排序

按评论数对帖子进行排序,然后按Rails中的Created_at日期排序

如何先按新日期排序,然后按通过日期排序?

如果日期相同,则按日期排序对象数组,然后按字符串值排序

java按当前日期排序列表,然后按日期比较

如何选择按日期列 desc 排序的不同记录 - Laravel

使用Laravel和Collection按日期DESC排序收集

firebase 按日期时间 desc 和 asc 排序

如何从特定ID获取按desc排序的行

按低于某个值的所有日期排序,然后按高于该值的所有日期排序

SQL 更新按特定日期排序的重复项

按字符串长度排序,然后按pl sql中的单个字母desc排序

先按字符串排序数组,然后按日期排序

LINQ按日期分组,然后按属性排序,以获取最高金额?