[nflug] SQL to sort IP addresses - hey Eric

pirrone pirrone at localnet.com
Sat Dec 17 13:15:34 EST 2005


Eric,

I posted that SQL query solution to your IP sort question in haste and 
left off a function required to convert the quartet I selected to a 
numerical value so that it would sort in correct order.  The most 
logically clear function in MySQL in the absence of a number() function 
is probably abs().  So to sort just the fourth quartet:

SELECT * FROM whatever_table
ORDER BY abs(substring_index(ip_address,'.',-1))
ASC;

which takes the portion on the right of the IP address back to the last 
dot (that '.' and -1) and converts it into a numerical value.  If you 
also need to sort by the third quartet first just add an additional 
expression:

SELECT * FROM whatever_table
ORDER BYabs(substring_index(substring_index(ip_address,'.',3),'.',-1)),
abs(substring_index(ip_address,'.',-1))
ASC;

which first takes the right piece of the IP address portion consisting 
of the first three quartets (that 3 and -1).

The same sorted result could be achieved with a simple unordered SELECT 
query in a PHP document, loading the table values into an array and 
performing a bubble sort, but I assume this ordered query will execute 
faster, is easier to write, and clearer to read.  Putting the above into 
a simple document that uses an external authentication page auth.php 
would look like:

<? require_once("auth.php") ?>
<html>
<head><title>test ip sort</title></head>
<body>
<p>Sorted by IP address:</p>
<?
    $return = mysql_connect("localhost",$PHP_AUTH_USER,$PHP_AUTH_PW);
    $status = mysql_select_db("test",$return);

    $result = mysql_query("SELECT * FROM machines order by 
    abs(substring_index(substring_index(ip_address,'.',3),'.',-1)), 
    abs(substring_index(ip_address,'.',-1)) asc",$return);
                               
    $num = mysql_numrows($result);
?>                             
<table border="1" cellpadding="2">
    <tr>                       
        <td>Computer</td><td>IP Address</td>    
    </tr>       
<?                             
        for ($i =0 ;$i < $num; $i++):
                echo "<tr>";   
                    echo "<td>";
                    echo mysql_result($result,$i,"computer");
                    echo "</td>";
                    echo "<td>";
                    echo mysql_result($result,$i,"ip_address");
                    echo "</td>";
                echo "</tr>";
        endfor;
    $status = mysql_close($return);
?>
</table>
</body>
</html>

And, there you have it.  Sorry for the omission.

Frank
_______________________________________________
nflug mailing list
nflug at nflug.org
http://www.nflug.org/mailman/listinfo/nflug



More information about the nflug mailing list