Hi all, I'm trying to work out the difference in a field between the last 2 updates in an updates table. I'm doing this as shown below:
mysql> SELECT -> (@in - AcctInputOctets) AS AcctInputOctets, -> (@out - AcctOutputOctets) AS AcctOutputOctets, -> (@in := AcctInputOctets), -> (@out := AcctOutputOctets) -> FROM updates -> WHERE acctuniqueid = '4b9fe4a361344536' -> ORDER BY updates.AcctSessionTime DESC LIMIT 2 -> ; +----------------------+----------------------+--------------------------+----------------------------+ | AcctInputOctets | AcctOutputOctets | (@in := AcctInputOctets) | (@out := AcctOutputOctets) | +----------------------+----------------------+--------------------------+----------------------------+ | 18446744073654284768 | 18446744073171813223 | 55266848 | 537738393 | | 9508 | 18620 | 55257340 | 537719773 | +----------------------+----------------------+--------------------------+----------------------------+ 2 rows in set (0.02 sec) mysql> explain (query above) *************************** 1. row *************************** id: 1 select_type: SIMPLE table: updates type: ref possible_keys: AcctUniqueID key: AcctUniqueID key_len: 34 ref: const rows: 327 Extra: Using where; Using filesort 1 row in set (0.00 sec) As can be seen, this query uses a key, and runs well. However, I only require the 2nd row of that dataset. I couldn't figure out a better way of doing it than this: mysql> SELECT AcctInputOctets, AcctOutputOctets FROM -> (SELECT -> (@in - AcctInputOctets) AS AcctInputOctets, -> (@out - AcctOutputOctets) AS AcctOutputOctets, -> (@in := AcctInputOctets), -> (@out := AcctOutputOctets) -> FROM updates -> WHERE acctuniqueid = '4b9fe4a361344536' -> ORDER BY updates.AcctSessionTime DESC LIMIT 2 -> ) AS t1 LIMIT 1,2 -> ; +-----------------+------------------+ | AcctInputOctets | AcctOutputOctets | +-----------------+------------------+ | 9508 | 18620 | +-----------------+------------------+ 1 row in set (0.02 sec) This does exactly what I want, but to me feels wrong, I think I'm missing a trick to doing this 'the right way'. Also, look at how the query runs: mysql> explain SELECT AcctInputOctets, AcctOutputOctets FROM -> (SELECT -> (@in - AcctInputOctets) AS AcctInputOctets, -> (@out - AcctOutputOctets) AS AcctOutputOctets, -> (@in := AcctInputOctets), -> (@out := AcctOutputOctets) -> FROM updates -> WHERE acctuniqueid = '4b9fe4a361344536' -> ORDER BY updates.AcctSessionTime DESC LIMIT 2 -> ) AS t1 LIMIT 1,2 -> \G *************************** 1. row *************************** id: 1 select_type: PRIMARY table: <derived2> type: ALL possible_keys: NULL key: NULL key_len: NULL ref: NULL rows: 2 Extra: *************************** 2. row *************************** id: 2 select_type: DERIVED table: updates type: ALL possible_keys: AcctUniqueID key: AcctUniqueID key_len: 34 ref: rows: 28717165 Extra: Using filesort 2 rows in set (0.02 sec) Apparently, it's doing a full table scan over all 29 million records. Whilst this query appears to run fast still, surly it's not right that a full table scan is needed? Thanks, Ian -- MySQL General Mailing List For list archives: http://lists.mysql.com/mysql To unsubscribe: http://lists.mysql.com/[EMAIL PROTECTED]