【问题标题】:PHP MySQL query - Show row only oncePHP MySQL查询 - 仅显示一次
【发布时间】:2017-08-05 04:33:37
【问题描述】:

我有一张类似的桌子

id    message    state        timestamp
1     abcd       Heartbeat    1970-01-01 01:00
2     efgh       Start        1970-01-01 02:00
3     sdcvsd     Stop         1970-01-01 02:30
4     efgh       Start        1970-01-01 03:00
5     sdcvsd     Stop         1970-01-01 03:30
6     dsdfsd     Heartbeat    1970-01-01 04:10
7     sdcsc      Heartbeat    1970-01-01 04:20
8     sewwdf     Heartbeat    1970-01-01 04:30

我想做的是用PHP查询这个表并显示行,但只显示Heartbeat的最新行,因为它非常重复,我只需要知道最后一次发生的时间。所有其他状态都会回显,即使它们是重复的。所以输出将是(最新的在顶部):

8 sewwdf     Heartbeat    1970-01-01 04:30
5 sdcvsd     Stop         1970-01-01 03:30
4 efgh       Start        1970-01-01 03:00
3 sdcvsd     Stop         1970-01-01 02:30
2 efgh       Start        1970-01-01 02:00

我只能把它排除在外

mysqli_query($con, " SELECT * FROM msg WHERE state <> 'Heartbeat' ORDER BY id DESC LIMIT 16 " );

我认为我不能将GROUP BYDISTINCT 用于多个州。

如何只查询最新的 Heartbeat 状态而不影响其他状态或删除 PHP 回显中的旧状态?

【问题讨论】:

  • mysqli_query($con, " SELECT * FROM msg GROUP BY id ORDER BY id DESC LIMIT 16" ); 试试这个
  • 还有1970-01-01 01:00 ?我觉得有什么问题吗?
  • 我为示例设置了日期/时间。
  • SELECT * FROM msg GROUP BY(state) HAVING timestamp = MAX(timestamp) ORDER BY id DESC LIMIT 16

标签: php mysqli


【解决方案1】:

这也有效:

select * from
`msg`
where
`state` = 'Heartbeat'
and
`id` =  
(
select
`id`
from
`msg`
where
`state` = 'Heartbeat'
order by `timestamp` desc
limit 1
)

union

select * from
`msg`
where
`state` <> 'Heartbeat'

order by `timestamp` desc

【讨论】:

  • 这些 id 是真实的,你想枚举结果行吗?
  • SELECT * FROM msg WHERE message = '$foo' AND state &lt;&gt; 'Heartbeat' UNION SELECT * FROM msg WHERE state = 'Heartbeat' AND id = (SELECT id FROM msg WHERE state = 'Heartbeat' ORDER BY id DESC LIMIT 1) ORDER BY id DESC LIMIT 16
【解决方案2】:

试试这个:

mysqli_query($con, "SELECT * FROM msg GROUP BY(state) ORDER BY id DESC LIMIT 16" );

【讨论】:

  • 这显示了每个状态的一行。我需要取消分组的所有状态,除了“心跳”状态,我需要显示最新的状态。
  • 不,这对每个州进行了分组。我不要那个。请仔细阅读问题并查看示例。
【解决方案3】:

您的查询是:

mysqli_query($con, " SELECT * FROM msg WHERE state <> 'Heartbeat' ORDER BY id DESC LIMIT 16 " );

我认为应该是:

mysqli_query($con, " SELECT * FROM msg WHERE state="Heartbeat" ORDER BY id DESC LIMIT 16 " );

你可以看到我附上的图片,他们发生了什么?谢谢。

【讨论】:

  • 不,这只会输出一种状态。
【解决方案4】:

试试这个查询:

SELECT * FROM `msg` GROUP BY `state` ORDER BY `id` DESC,`Timestamp` DESC LIMIT 16 

会有用的

【讨论】:

  • 不,这对每个州进行了分组。我不想那样。
  • 所以你只想要state with heartbeat
【解决方案5】:

你也可以试试这个

select * from `test2` where `state` != 'Heartbeat' OR `id` = (select `id` from `test2` where `state` = 'Heartbeat' order by `date` desc limit 1 )

如果需要带日期的订单

select * from `test2` where `state` != 'Heartbeat' OR `id` = (select `id` from `test2` where `state` = 'Heartbeat' order by `date` desc limit 1 ) ORDER BY date DESC

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-03-26
    • 2015-12-11
    • 1970-01-01
    • 1970-01-01
    • 2015-03-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多