MS SQL 查询最后5条记录,该如何操作。

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MS SQL 查询最后5条记录,该如何操作。相关的知识,希望对你有一定的参考价值。

$link = mssql_connect($server, $username, $password);
mssql_select_db($database, $link);
if(isset($_REQUEST["select"])!='')$num = $_REQUEST["select"];else$num = '11';
$sql="select top 1 UserID,UserName,CardID,CardZoneID,EventTime,MachineName from VNHValidCardEvent where ControlMachineAddress =$num ";
$result = mssql_query($sql, $link);
$row = mssql_fetch_array($result, MSSQL_BOTH);
mssql_free_result($result);
echo '警号:'.$row[0].'<br>';
echo '姓名:'.$row[1].'<br>';
echo '卡号:'.$row[2].'<br>';
echo '区号:'.$row[3].'<br>';
echo '时间:'.$row[4].'<br>';
echo '监门:'.$row[5].'<br>';
echo '<img src="./photo/'.$row[1].'.jpg" width="200px" height="300px" border="0">';

我基础较弱,上述程序自己查网络写出来的。现在领导希望能在屏幕上显示出最后5人的信息和照片,该如何改这个程序。谢谢。
语言是php

你的这个问题 用数据分页就能解决的哦!
SELECT TOP 5 id FROM TestTable ORDER BY id desc
思路:1、把数据全部查询出来;select * from TestTable
2、把数据按照倒叙的方式排列;select * from TestTable order by id desc (asc正序,desc倒叙)
3、取得倒叙的头5条;SELECT TOP 5 id FROM TestTable ORDER BY id desc
参考技术A

数据表要有规律,比如按照时间自增或者有记录创建时间,

以有自增列为例:

select top 5 * from tb
order by ID desc  --排序,后面往前排,再是使用TOP5 提取前5条数据

参考技术B 最后5人的最后是按照什么排序,你的sql 写的是top 1,智能取出来一个结果,显示不了5个人。如果是要找创建时间啥的,可以用order by 的逆序,取top 5就可以。追问

最后5人,是按时间顺序排的,这是一个门禁的数据库,领导希望在屏幕上显示通过这个门的最后5人。因为最后一条刷卡记录在最上面,我就用TOP 1 了。

追答

那加一个order by create_time(打卡时间字段名称) desc , 然后top 5,就是最后5人了。

本回答被提问者采纳

SQL查询从链接表中检索最后一条记录[重复]

【中文标题】SQL查询从链接表中检索最后一条记录[重复]【英文标题】:SQL query to retrieve last record from a linked table [duplicate] 【发布时间】:2016-09-17 19:09:06 【问题描述】:

我编写了一个查询来比较不同表中的 2 列 (TRELAY VS TUSERDEF8)。该查询效果很好,只是它检索了TUSERDEF8 表中的顶部记录,该记录与TRELAY 表具有多对一关系。

这些表由TRELAY.ID = TUSERDEF8.N01 链接。我想从TUSERDEF8 检索最新记录并将该记录与TRELAY 记录进行比较。我打算使用索引列的最大值(TUSERDEF8.ID)来确定最新记录。

我正在使用 SQL Server。

我的代码如下,但我不确定如何更改查询以检索最后一个 TUSERDEF8 记录。任何帮助表示赞赏。

SELECT 
    TRELAY.ID, TRELAY.S15, 
    TUSERDEF8.S04, TUSERDEF8.N01, TUSERDEF8.S06
FROM 
    TRELAY
INNER JOIN 
    TUSERDEF8 ON TRELAY.ID = TUSERDEF8.N01
WHERE 
    LEFT(TRELAY.S15, 1) <> LEFT(TUSERDEF8.S04, 1)
    AND NOT (TRELAY.S15 LIKE '%MEDIUM%' AND
             TUSERDEF8.S04 LIKE '%N/A%' AND
             TUSERDEF8.S06 LIKE '%EACMS%')

【问题讨论】:

【参考方案1】:

假设您的 ID 是 int(s),那么下面的方法可能有效吗?

SELECT TOP 1 TRELAY.ID, TRELAY.S15, TUSERDEF8.S04, TUSERDEF8.N01, TUSERDEF8.S06
FROM TRELAY INNER JOIN TUSERDEF8 
ON TRELAY.ID = TUSERDEF8.N01
WHERE LEFT(TRELAY.S15, 1) <> LEFT(TUSERDEF8.S04, 1)
AND NOT (
    TRELAY.S15 LIKE '%MEDIUM%' 
    AND TUSERDEF8.S04 LIKE '%N/A%' 
    AND TUSERDEF8.S06 LIKE '%EACMS%'
    )
ORDER BY TUSERDEF8.ID DESC

HTH

戴夫

【讨论】:

这只会给出一行,而不是每个 TRELAY 行的顶行。 好的...没有得到每一行的需要...认为 Joe C 的 CTE 可能是要走的路... 我不确定您的查询如何在 TRELAY.S15 字段中返回“低”。 @Joe Christou 问题说明“...我想从 TUSERDEF8 检索最新记录 ...”,因此将列出“ORDER BY TUSERDEF8.ID DESC”..max id第一个匹配 TRELAY 记录。我确实完全意识到找到每个具有匹配最大 TUSERDEF8 记录的 TRELAY 记录的要求......抱歉......【参考方案2】:

你可以这样做:

With cteLastRecord As
(
Select  S04, N01, S06, 
        Row_Number() Over (Partition By N01, Order By ID Desc) SortOrder 
    From TUSERDEF8
)
SELECT 
    TRELAY.ID, TRELAY.S15, 
    TUSERDEF8.S04, TUSERDEF8.N01, TUSERDEF8.S06
FROM 
    TRELAY
INNER JOIN 
    (Select S04, N01, S06 From cteLastRecord Where SortOrder = 1) TUSERDEF8 ON TRELAY.ID = TUSERDEF8.N01
WHERE 
    LEFT(TRELAY.S15, 1) <> LEFT(TUSERDEF8.S04, 1)
    AND NOT (TRELAY.S15 LIKE '%MEDIUM%' AND
             TUSERDEF8.S04 LIKE '%N/A%' AND
             TUSERDEF8.S06 LIKE '%EACMS%')

【讨论】:

【参考方案3】:

我相信您的预期输出仍然有点模棱两可。

在我看来,您只需要 TUSERDEF8.ID 为最大值的输出中的记录。如果这是正确的,那么试试这个:

SELECT TRELAY.ID, TRELAY.S15, TUSERDEF8.S04, TUSERDEF8.N01, TUSERDEF8.S06
FROM TRELAY
  INNER JOIN TUSERDEF8 ON TRELAY.ID = TUSERDEF8.N01
WHERE LEFT(TRELAY.S15, 1) <> LEFT(TUSERDEF8.S04, 1)
  AND NOT (TRELAY.S15 LIKE '%MEDIUM%' AND
           TUSERDEF8.S04 LIKE '%N/A%' AND
           TUSERDEF8.S06 LIKE '%EACMS%')
  AND TUSERDEF8.ID IN (SELECT MAX(TUSERDEF8.ID) FROM TUSERDEF8)

编辑:在查看了您最近的 cmets 之后,看起来像这样的东西会更合适:

SELECT 
  , C.ID
  , C.S15, 
  , D.S04
  , D.N01
  , D.S06
FROM (
    SELECT A.ID, A.S15, MAX(B.ID) AS MaxID
    FROM TRELAY AS A
    INNER JOIN TUSERDEF8 AS B ON A.ID = B.N01
    WHERE 
    LEFT(A.S15, 1) <> LEFT(B.S04, 1)
    AND NOT (A.S15 LIKE '%MEDIUM%' AND
             B.S04 LIKE '%N/A%' AND
             B.S06 LIKE '%EACMS%')
    GROUP BY A.ID, A.S15
) AS C
INNER JOIN TUSERDEF8 AS D ON C.ID = D.N01 AND C.MaxID = D.ID

【讨论】:

谢谢。我认为这可以满足我的需要,但是输出不明确是什么意思? @JoeChristou 我的意思是我不确定您是否要求 1 行输出或其他内容(例如,请参阅 @Dave 的答案 cmets 中的混淆)。我提供的查询将为您提供 1 行作为您的输出,其中 TUSERDEF8.ID 处于其当前最大值(即,如果该 ID 还没有在 TRELAY 中建立适当的关系,那么您将得到一个 0 -行答案)。这假定基于整数的递增TUSERDEF8.ID。如果您每次运行查询时都需要 1 行,那么您应该使用 @Dave 的答案,因为它会为您提供已经包含所有关系的最新 TUSERDEF8.ID 哦,抱歉。我想循环浏览所有 TRELAY 记录并与相关的最新 TUSERDEF8 记录进行比较。提供一些背景知识,我们正在对每台设备进行预评估,以确定影响级别、低、中或否。然后在不同的数据库中进行官方评估。这些结果将发送回 TUSERDEF8,我想对最新评估 (TUSERDEF8) 进行比较,以验证影响级别是否匹配。希望能解释清楚。 补充一点,在重新阅读回复后。我只想要与每个 TRELAY.ID 链接的 TUSERDEF8 记录中的 Max(TUSERDEF8.ID)。上帝,我希望这是有道理的。 @JoeChristou 所以你想要一个多记录输出,其中每个TRELAY 记录仅与其(最大)TUSERDEF8.ID 记录匹配?如果是这样,我将不得不写一个不同的答案。【参考方案4】:

使用 ID 列来确定哪一行是“最后一行”是个坏主意

使用像“TUSERDEF8”这样的神秘表名(它与 TUSERDEF7 有什么不同)是一个非常糟糕的主意,同时使用像“S04”这样的完全神秘的列名。

对表格使用像“T”这样的前缀是个坏主意 - 应该已经很清楚它是一个表格。

现在所有这些都已经解决了:

SELECT 
    R.ID,
    R.S15,
    U.S04,
    U.N01,
    U.S06
FROM 
    TRELAY R
INNER JOIN TUSERDEF8 U ON U.N01 = R.ID
LEFT OUTER JOIN TUSERDEF8 U2 ON
    U2.N01 = R.ID AND
    U2.ID > U.ID
WHERE
    U2.ID IS NULL AND    -- This will only happen if the LEFT OUTER JOIN above found no match, meaning that the row in U has the highest ID value of all matches
    LEFT(R.S15, 1) <> LEFT(U.S04, 1) AND
    NOT (
        R.S15 LIKE '%MEDIUM%' AND
        U.S04 LIKE '%N/A%' AND
        U.S06 LIKE '%EACMS%'
    )

【讨论】:

此答案中逻辑的未经证实的重复:***.com/a/2111420/1507566 它是“不可信的”,因为我自己想出了这个查询。每次我输入查询时,我都不会搜索互联网,只是为了看看其他人之前是否输入过。每次你写出WHILE 循环时,你是否给予肯定,因为有人曾经在你之前使用过它? 仅发表评论以说明我投反对票的原因,并不意味着个人批评,我当然也没有暗示您故意抄袭的意思。我尽量不要在没有评论的情况下投反对票。感谢您投票结束。 顺便说一句,这是我在 Bill Karwin 发布一年半之前使用的相同方法:***.com/questions/227037/…。你应该给他投反对票。 确定该链接?我看到的答案似乎是关于 JOIN 与 EXISTS 的性能,这根本不是一回事。但是,如果您确实比我引用的答案更早地发布了此逻辑,我很乐意将其收藏以备将来标记。如果你知道你已经发布了这个逻辑,为什么不标记欺骗而不是回答呢?

以上是关于MS SQL 查询最后5条记录,该如何操作。的主要内容,如果未能解决你的问题,请参考以下文章

sql 查询最后一条记录

SQL查询从链接表中检索最后一条记录[重复]

当值与 SQL Server 中的最后一条记录之间存在特定差距时如何选择值

Python查询sql db中的最后一条记录,但返回空白记录

如何从 sql 查询中获取第一条和最后一条记录?

SQL分页过多时, 如何优化