SQL - 在按创建日期订购“重复重新推送”时显示一行两次

Posted

技术标签:

【中文标题】SQL - 在按创建日期订购“重复重新推送”时显示一行两次【英文标题】:SQL - Display a row twice while ordering the "duplicate repush" by date created 【发布时间】:2015-11-23 02:37:52 【问题描述】:

我有一张表(“cmets”),里面有 cmets,它们的创建日期,如果通过 php 按钮将它们推到前面,那么日期也是(否则日期将是 '0000- 00-00')。我想要的是正常显示的表格,但是将被“拒绝”的 cmets 推送到表格中的某个位置,该位置的创建日期为 ORDER BY(“已创建”)。

这是我想要实现的示例,它涉及将旧评论 (ID: 4) 推到顶部(注意:表中没有重复的 ID,只有查询结果会将重新推送的记录复制为此处显示):

id | comment | created             | repushed
---+---------+---------------------+-------------------
4  | hello   | 2015-05-11 06:11:12 | 2015-11-22 11:17:01
23 | recent  | 2015-05-22 12:18:23 | 0000-00-00 00:00:00
22 | recent  | 2015-05-22 11:15:43 | 0000-00-00 00:00:00
21 | recent  | 2015-05-22 10:23:10 | 0000-00-00 00:00:00
4  | hello   | 2015-05-11 06:11:12 | 2015-11-22 11:17:01

所以我尝试使用 UNION 将所有 cmets 与重新推送的 cmets 组合(因此所有重新推送的 cmets 将出现在查询后重复),但是我想将重复的重新推送 cmets 视为如果它们是在它们被重新推送时创建的,那么我需要交换重复项的“created”和“repushed”列值以获得这种效果,然后按“created”排序。

SELECT *
FROM comments
WHERE repushed != '0000-00-00 00:00:00'
UNION ALL                         
SELECT *
FROM comments
ORDER BY created DESC

当然这不会按预期工作,因为我不知道如何交换两列值。

【问题讨论】:

您能添加您的预期结果吗? 嗨。我在这里显示的表格是我的预期/预期结果 【参考方案1】:

使用你已有的东西试试这个:

SELECT id,comment,repushed as created,repushed 
FROM comments   
WHERE repushed != '0000-00-00 00:00:00' group by id
UNION ALL 
SELECT * 
FROM comments group by id ORDER BY created DESC

这会将重新推送的列重命名为 created

【讨论】:

不应该只在第二个联合选择上订购吗? 我得到:数据库查询失败:每个派生表都必须有自己的别名 尝试我的编辑(删除括号内的顺序) 还是同样的错误。我并没有真正关注 SELECT * FROM () 的使用,你能详细说明一下吗?谢谢 以前是通过创建所有数据进行排序,在@Justin 评论后我删除了该排序,因此不再需要它。

以上是关于SQL - 在按创建日期订购“重复重新推送”时显示一行两次的主要内容,如果未能解决你的问题,请参考以下文章

如何在 QTabWidget 中隐藏选项卡并在按下按钮时显示它

检查表单输入是不是为空,如果不是,则在按下提交按钮时显示隐藏的 div

如何在按下按钮的同时选择两个下拉选项时显示隐藏div

日期选择器不会在laravel中单击时显示日历

按下底部颤动时显示警报

在 Swift 中向 UITableView 添加按日期分隔的部分