如何从MySQL结果中选择第一行和最后一行数据?

10

SELECT * from User 返回了75个用户。有没有可能选择第1个用户和第75个用户而不使用while($row = mysql_fetch_assoc($result)),该怎么做?

更新

为了更清楚,请注意:我需要使用SELECT *,因为我需要在执行while mysql_fetch_assoc之前获得第一个和第75个用户,所以不需要回答关于ASC,DESC,LIMIT的问题。


1
SELECT ... WHERE id IN(1,75) 的翻译是什么? - Linus Kleen
1
如果它不能总是得到75个用户,你可能需要运行两个查询,因为第一次你不知道有多少个...除非可以使用 LIMIT COUNT(*) - 1, 1?可能不行。 - Andrew
6个回答

24
SELECT * from User LIMIT 1
UNION
SELECT * from User LIMIT 74,1

编辑

@Kay:PHP 无法在创建结果集后更改其内部顺序。

如果查询始终返回 75 行,则访问第 1 行和第 75 行的唯一方法是使用mysql_data_seek,该函数可以移动内部结果指针:

$result = mysql_query('SELECT * from User');

mysql_data_seek($result, 1);
$row1 = mysql_fetch_assoc($result);

mysql_data_seek($result, 75);
$row75 = mysql_fetch_assoc($result);

请注意,如果上述代码之后跟着一个 while 循环,那么指针必须被重置到适当的位置。


谢谢,但我还需要所有其他的结果。在循环之前,我需要对第一条和其他记录采取一些行动。请参见pdate。 - Kay

17

如果你能排序,那么你就可以了。

Select * from User order by [something] asc limit 1

并且

Select * from User order by [something] desc limit 1

如果您有不同数量的结果,这是一个好的解决方案!好主意。 - NotJay

5
假设您的主键为'id',您需要最后一个(而不是第75个),您可以尝试类似以下的代码:
假设你有'id'作为主键,你需要最后一个(不是第75个),你可以尝试这样的代码:
SELECT * FROM User WHERE id IN ((SELECT min(id) FROM user b), (SELECT max(id) FROM user c)) 

3
SELECT 
(SELECT column FROM table WHERE [condition] ORDER BY column LIMIT 1) as 'first',
(SELECT column FROM table WHERE [condition] ORDER BY column DESC LIMIT 1) as 'last'

1
SELECT  u.*
FROM    Users u
        INNER JOIN (
          SELECT MIN(UserID) AS UserID FROM Users
          UNION ALL SELECT MAX(UserID) FROM Users
        ) um ON um.UserID = u.UserID

编辑

我不确定我完全理解你所需要的,但以下代码可以获取第一个和最后一个关注其他用户的用户:

SELECT  um.SortOrder, u.*
FROM    Users u
        INNER JOIN (
          SELECT 1 AS SortOrder, MIN(UserID) AS UserID FROM Users
          UNION ALL SELECT 2, MAX(UserID) FROM Users
        ) um ON um.UserID = u.UserID
UNION ALL
SELECT  3 AS SortOrder, u.*
FROM    Users u
        LEFT OUTER JOIN (
          SELECT MIN(UserID) AS UserID FROM Users
          UNION ALL SELECT MAX(UserID) FROM Users
        ) um ON um.UserID = u.UserID
WHERE   um.UserID IS NULL
ORDER BY
        SortOrder

0

嗯,你的问题标题与解释有点不同。

我这么说是因为如果你想选择第一行和最后一行,那么选择第1行和第75行可能会有所不同,因为如果行数增加或减少,最后一行可能不是第75行。

回答第一行和最后一行的部分,我认为你可以这样做。

select distinct(id) from users where id in ((select max(id) from user), (select min(id) from users));

假设用户按id排序,这个查询将运行良好。

但是,如果你要谈论第1行和第75行,那么我会接受@Saul的答案。

希望这可以帮到你。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接