Re: Manipulating "categories" in a mysql database

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Tue, January 30, 2007 12:36 pm, Tim wrote:
> This is more of a conceptional question rather then a technical one.
>
> I am developping an online catalog, the catalog is a standard
> categorie/subcat/subsubcat system using the following logic in my
> database:
>
> cat_id   cat_name
>
> 10        DVD
> 1010     DVD/Action
> 1020     DVD/Adventure
> 20        CD
> 2010     CD/Reggae
> 2020     CD/Electro
>
> Up to now I enter the category id's manually from an administration
> console.
>
> I would like to be able to have my console automagically generate a
> cat_id
> when my users add categories (so they don't have to bother with that
> aspect
> of adding a category) and I would also like to be able to move a
> category up
> or down in the way it displays on the page, as of now I am sorting by
> cat_id

Rule of thumb for SQL:
Never ever ever sort by *_id, because it will almost alway send up
biting you in the butt sooner or later.

Add a 'rank' column and maintain that in your web application.

> I have been for a while trying to develop a logical scheme to be able
> to
> generate the id's and change their cat_id to reflect a "new" position
> in how
> it displays (displaying DVD/Action after DVD/Adventure for example I
> would
> need to change the cat_id from 1010 to something above 1020 say 1021).
> This
> is fine as I can test the previous elements cat_id and add or subtract
> 1 but
> I get stuck when I have a cat_id say 1010 that I would want to put
> between
> 1011 and 1012. I'm having trouble developing the algorithm that would
> allow
> this..

Once you separate the cat_id and the 'rank' you will have no problems.

Your cat_id can just be auto_increment and never displayed to the user.

Your 'rank' can be a simple integer, and to re-order you'll just do like:

<?php
//Assume cat_id # 7 needs to move to the 42nd place in the list:
$cat_id = 7;
$new_rank = 42;
$query = "update catalog set rank = rank + 1 where rank >= $new_rank";
mysql_query($query) or error_log(mysql_error() . " $query");
$query = "update catalog set rank = $new_rank where cat_id = $cat_id";
mysql_query($query) or error_log(mysql_error() . " $query");
?>

This may create a "hole" in the rank listing, if $cat_id 7 used to be
LOWER than 42.

A little bit more effort can solve this, however.
AFTER the above queries, tack on:
if ($old_rank < $new_rank){
  $query = "update catalog set rank = rank - 1 where rank > $old_rank";
  mysql_query($query) or error_log(mysql_error() . " $query");
}

You could go even further and change the minimum number of ranks
needed in any given change, to avoid thrashing the index on the rank. 
This would be crucial if your table was very large.

-- 
Some people have a "gift" link here.
Know what I want?
I want you to buy a CD from some starving artist.
http://cdbaby.com/browse/from/lynch
Yeah, I get a buck. So?

-- 
PHP General Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php


[Index of Archives]     [PHP Home]     [Apache Users]     [PHP on Windows]     [Kernel Newbies]     [PHP Install]     [PHP Classes]     [Pear]     [Postgresql]     [Postgresql PHP]     [PHP on Windows]     [PHP Database Programming]     [PHP SOAP]

  Powered by Linux