【问题标题】:SQL select previous record whereSQL选择上一条记录在哪里
【发布时间】:2011-07-15 21:08:22
【问题描述】:

所以我试图通过一个表进行查询,称之为学生 如果 Student 中的“status”列是“active”,则从上一条记录中选择“firstName”和“lastName”列。每条记录都有一个主键。 也就是说,如果记录的“状态”列是=活动,那么,我想选择上一个记录。 该表已经填充了诸如

之类的数据
id  firstname   lastname    status          email
9   Joe         Peters      inactive        fp@gmail.com
10  kim         Rol         active          rt@yh.com
11  Lance       Ree         inactive        lll&hh.com
12  diana       Jones       active          sams@yahoo.com

对于这个数据,查询应该返回 Joe peters 和 lance ree 我怎样才能做到这一点? 谢谢

【问题讨论】:

  • SQL 中没有“以前的记录”。以前的顺序是什么?
  • 你能解释一下你想在更高层次上做什么吗?也许有更简单的方法?
  • 如果您可以在表格中提取数据,这样我们就可以看到您要查找的内容,这将有所帮助。如果您的意思是在 status column='active' 时选择上一行,那么您的设计可能存在严重错误。
  • 假设:在 SELECT 查询之后,他想回到结果集中:-?
  • 如果 id 10 处于活动状态,你想要 Joe Peters?

标签: mysql select join


【解决方案1】:

如果您只是想从学生为active 的记录中选择姓名,则查询很简单

SELECT id, firstname, lastname
FROM students
WHERE status = "active"

我假设您所说的上一行是指您刚刚确定为活跃学生的行。该查询将检查您的表中是否有活跃的学生并检索他们的姓名。因为名称很少是唯一的,所以我包括了 ID 列。 我还建议将状态列设置为 0 或 1 整数。

如果真的要选择上一行,可以使用

SELECT sj.id, sj.firstname, sj.lastname
FROM students AS s
LEFT JOIN students AS sj ON (sj.id = s.id - 1)
WHERE s.status = "active"

关键在于确定您拥有的行与您要选择的行之间的关系。在这种情况下,您要选择 ID 1 小于当前行的行。由于此约束非常严格,因此以这种方式选择行不是一个好主意。您可能想要重新设计您的数据库。

【讨论】:

  • 另外,您的活跃学生是 Kim Rol 和 Diana Jones。如果你想要 Joe Peters 和 Lance Ree 设置status = "inactive"
  • 谢谢。这只是一个例子,我想知道是否有可能/是否有一种捷径可以根据当前记录选择一些以前的记录
  • 这仅在您的 id 列中没有因删除记录等而出现间隙时才有效。
  • 是的,它适用于 ID 1 的给定约束。如果您想扩展以允许间隙,则需要对其进行更改以从诸如(SELECT MAX(id) FROM students WHERE id < s.id) 的子查询之类的东西中获取 ID 值。问题是,您可以拥有任意数量的此类扩展,每个都比上一个更复杂。因此,尝试以这种方式选择行是个坏主意。
【解决方案2】:

对于以前的记录,您可能指的是 priviously 插入的记录。您可以使用 last_insert_id() 引用该行 - 这是一个 mysql 函数 - 将返回最后插入的自动递增值。

select * from T where id = last_insert_id();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-28
    • 1970-01-01
    • 2014-04-08
    • 2011-01-24
    • 2020-05-26
    • 1970-01-01
    • 2020-08-20
    • 2014-08-10
    相关资源
    最近更新 更多