【问题标题】:Querying Comma Delimited Values in MySQL在 MySQL 中查询逗号分隔的值
【发布时间】:2014-05-07 20:44:31
【问题描述】:

我需要一种查询数据集合的方法。我有一个最近活动日期的列表,每个日期都存储在每个用户的 1 行中。每行都有一个 loginDates 字段,由逗号分隔的时间戳列表组成。

我需要做的是在这个日期运行报告以查找自 XXXXXX 时间戳以来活跃的人。问题在于它是逗号分隔的,这意味着我无法使用我知道的方法查询它。

这是一个示例行

id  userID  accessDates
2   6   1399494405,1399494465,1399494525,1399494585,1399494623

我想用纯文本实现什么

SELECT all_fields FROM accessTable WHERE accessDate > YESTERDAY 

然而,这些日期可能跨越数百天,现场有数百个时间戳。

【问题讨论】:

  • 学习正确的数据库设计是多么重要的原因,您不会将日期/时间值存储为字符串,也不会将事物列表放在逗号分隔的列中。这就是关系数据库有表的原因。使用它们。并且,了解联结表(也称为关联表)。
  • 与其试图拼凑解决方案,不如修复数据模型。如果这些是日期,则应将它们保存为日期。每条记录都应该有自己的行。那时您会发现实际处理数据要容易得多。
  • 改变结构不是一种选择。我正在尝试根据现有数据设计报告。因此我的问题。

标签: mysql sql querying


【解决方案1】:

假设 TimeStamp 值按照您的数据示例显示的顺序排列,如果字符串中的任何 TimeStamp 值大于给定日期,那么最新的值也将大于该值。因此,您只需要最新的 TimeStamp 值即可满足您的要求:

SET @Yesterday =
  UNIX_TIMESTAMP(DATE_ADD(DATE(CURRENT_TIMESTAMP()),INTERVAL -1 DAY));

SELECT *
FROM accessTable
WHERE  CAST(RIGHT(accessDates,10) AS UNSIGNED) > @Yesterday;

如果您想单独查询每个时间戳,最好的解决方案是将它们放入带有用户 ID 的单个表列中:

userID    accessDate
------    ----------
6         1399494405
6         1399494465
6         1399494525
6         1399494585
6         1399494623

【讨论】:

  • 这对我来说可能更有意义。我有能力添加一个表。因此,我可以在报告之前运行查询,按照您的建议将逗号分隔字段中的所有日期分隔成行。可以直接在查询中分隔每一行的逗号分隔值吗?
  • 在 MySql 中,您需要创建一个过程来遍历 accessTable 记录并解析字符串:stackoverflow.com/questions/17308669/…
  • 干杯! :) 如果我对您有所帮助,请考虑将我的标记为最佳答案或让我知道我可以添加哪些其他信息。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多