I can't do it by ID because what if a row in the middle somewhere gets deleted? I need to do it by the position in the table, and a static numbering column won't work. This is a solution someone on EFNet came up with:
SET @rowcount=0; select docid,@rowcount:=@rowcount+1 as num FROM documents HAVING (num+1)%6=0 It works. However, if I do: SET @rowcount=0; SELECT docid,@rowcount:=@rowcount+1 as num FROM documents; The "num" associated with each "docid" is different than the ones that return from the first query. This seems weird, possibly a bug? Here are the results for you guys to chew on. As you will see, in the first result set, when docid=55, num=25 (25th record in the table). However, on the second result set, when docid=55, num=30. I can prove that docid=55 is actually the 25th record in the table because: SELECT docid FROM documents LIMIT 24,1 Returns docid=55. I'd love to hear what you guys think. Here's the result I promised: mysql> select docid,@rowcount:=@rowcount+1 as num from documents limit 40; +-------+------+ | docid | num | +-------+------+ | 2 | 1 | | 4 | 2 | | 5 | 3 | | 6 | 4 | | 7 | 5 | | 8 | 6 | | 9 | 7 | | 10 | 8 | | 11 | 9 | | 12 | 10 | | 13 | 11 | | 14 | 12 | | 15 | 13 | | 16 | 14 | | 17 | 15 | | 20 | 16 | | 21 | 17 | | 34 | 18 | | 35 | 19 | | 36 | 20 | | 37 | 21 | | 39 | 22 | | 40 | 23 | | 41 | 24 | | 55 | 25 | | 56 | 26 | | 59 | 27 | | 61 | 28 | | 77 | 29 | | 80 | 30 | | 81 | 31 | | 82 | 32 | | 83 | 33 | | 84 | 34 | | 85 | 35 | | 86 | 36 | | 88 | 37 | | 93 | 38 | | 106 | 39 | | 109 | 40 | +-------+------+ 40 rows in set (0.00 sec) mysql> select docid,@rowcount:=@rowcount+1 as num FROM documents HAVING (num+1)%6=0 LIMIT 30; +-------+------+ | docid | num | +-------+------+ | 7 | 6 | | 12 | 12 | | 17 | 18 | | 36 | 24 | | 55 | 30 | | 80 | 36 | | 85 | 42 | | 109 | 48 | | 119 | 54 | | 125 | 60 | | 136 | 66 | | 147 | 72 | | 152 | 78 | | 160 | 84 | | 166 | 90 | | 171 | 96 | | 178 | 102 | | 185 | 108 | | 191 | 114 | | 207 | 120 | | 213 | 126 | | 218 | 132 | +-------+------+ 22 rows in set (0.00 sec) -----Original Message----- From: Benjamin Pflugmann [mailto:[EMAIL PROTECTED]] Sent: Sunday, December 22, 2002 10:41 AM To: SpamSucks86 Cc: [EMAIL PROTECTED]; [EMAIL PROTECTED] Subject: Re: Return every Nth row in a result set Hello. On Sun 2002-12-22 at 08:56:43 -0500, [EMAIL PROTECTED] wrote: > I really don't want to do this client side (I'd have to execute > approximately 10 queries for every page load just for this small task). > Selecting the entire table into a temp table to number the rows also > seems rather inefficient. I was reading in a book at Barnes and Noble > yesterday which said to use a query that looked something like this: > > SELECT a.id FROM documents as a, documents as b WHERE a.id >= b.id GROUP > BY a.id HAVING MOD(a.id,:n); > > I'm nearly positive that that isn't exactly what it said, but it was > something like that. If anyone can come up with a way to do this without > a temporary table and only one or two queries (using 3.x or 4.0) that'd > be great. Thanks for the help guys. Well, the solution is already in there: they suggest using a HAVING clause to reduce the rows after the complete result set has been determined. And to use MOD(id, number) to select which rows to keep. MOD(id,10) will return 0 for multiples of 10. So, if you want every 10th rows, you would use SELECT * FROM your_table WHERE some_condition HAVING NOT MOD(id,10) If you still encounter problems, please elaborate. And include a real example of what you tried. HTH, Benjamin. -- [EMAIL PROTECTED] --------------------------------------------------------------------- Before posting, please check: http://www.mysql.com/manual.php (the manual) http://lists.mysql.com/ (the list archive) To request this thread, e-mail <[EMAIL PROTECTED]> To unsubscribe, e-mail <[EMAIL PROTECTED]> Trouble unsubscribing? Try: http://lists.mysql.com/php/unsubscribe.php