On Jan 11, 2012 7:13 AM, "Karl DeSaulniers" <karl@xxxxxxxxxxxxxxx> wrote: > > > On Jan 10, 2012, at 10:49 PM, Karl DeSaulniers wrote: > >> >> On Jan 10, 2012, at 9:30 AM, B. Aerts wrote: >> >>> On 08/01/12 23:35, Karl DeSaulniers wrote: >>>> >>>> >>>> On Jan 8, 2012, at 10:36 AM, Bastien wrote: >>>> >>>>> >>>>> >>>>> On 2012-01-08, at 7:27 AM, Niel Archer <not@xxxxxxxxxx> wrote: >>>>> >>>>>> >>>>>> -- >>>>>> Niel Archer >>>>>> niel.archer (at) blueyonder.co.uk >>>>>>> >>>>>>> Hello phpers and sqlheads, >>>>>>> If you have a moment, I have a question. >>>>>>> >>>>>>> INTRO: >>>>>>> I am trying to set up categories for a web site. >>>>>>> Each item can belong to more than one category. >>>>>>> >>>>>>> IE: Mens, T-Shirts, Long Sleeve Shirts, etc.. etc.. >>>>>>> (Sorry no fancy box drawing) >>>>>>> >>>>>>> QUESTION: >>>>>>> My question is what would the best way be to store this in one MySQL >>>>>>> field and how would I read and write with PHP to that field? >>>>>>> I have thought of enum() but not on the forefront of what that >>>>>>> actually does and what it is best used for. >>>>>>> I just know its a type of field that can have multiple items in it. >>>>>>> Not sure if its what I need. >>>>>>> >>>>>>> REASON: >>>>>>> I just want to be able to query the database with multiple category >>>>>>> ID's and it check this field and report back if that category is >>>>>>> present or if there are multiple present. >>>>>>> Maybe return as a list or an array? I would like to stay away from >>>>>>> creating multiple fields in my table for this. >>>>>> >>>>>> >>>>>> Have you considered separate tables? Store the categories in one table >>>>>> and use a third to store the item and category combination, one row per >>>>>> item,category combo. This is a common pattern to manage such situations. >>>>>> >>>>>>> NOTE: >>>>>>> The categories are retrieved as a number FYI. >>>>>>> >>>>>>> Any help/code would be greatly appreciated. >>>>>>> But a link does just fine for me. >>>>>>> >>>>>>> Best Regards, >>>>>>> >>>>>>> Karl DeSaulniers >>>>>>> Design Drumm >>>>>>> http://designdrumm.com >>>>>>> >>>>>>> Hope your all enjoying your 2012! >>>>>> >>>>>> >>>>>> >>>>>> -- >>>>>> PHP Database Mailing List (http://www.php.net/) >>>>>> To unsubscribe, visit: http://www.php.net/unsub.php >>>>>> >>>>> >>>>> Neil's solution is the best. Storing a comma separated list will >>>>> involve using a LIKE search to find your categories. This will result >>>>> in a full table scan and will be slow when your tables get bigger. >>>>> Storing them in a join table as Neil suggested removes the need for a >>>>> like search an will be faster >>>>> >>>>> Bastien >>>>> -- >>>>> PHP Database Mailing List (http://www.php.net/) >>>>> To unsubscribe, visit: http://www.php.net/unsub.php >>>>> >>>> >>>> Thanks guys for the responses. So.. what your saying if I understand >>>> correctly. >>>> Have the categories in one table all in separate fields. >>>> Than have a the products table. Than have a third table that stores say >>>> a product id >>>> and all the individual categories for that product in that table as >>>> separate fields associated with that product id? >>>> >>>> Am I close? Sounds like a good situation, but I didn't want to really >>>> create a new table. >>>> One product will probably have no more than 3 combinations of >>>> categories. So not sure it this is necessary. >>>> >>>> EG: >>>> >>>> Tshirts = 1 >>>> Jackets = 2 >>>> etc.. >>>> >>>> Mens = 12 >>>> Womens = 13 >>>> >>>> So lets say I want to find all the Mens Tshirts.. I was wanting one >>>> field to hold the 1, 12 >>>> >>>> hope that clarifies >>>> >>>> Karl DeSaulniers >>>> Design Drumm >>>> http://designdrumm.com >>>> >>> >>> Hi Karl, >>> >>> if you don't want to do with the third-table-solution, how about an assembler-style bit-wise OR of all categories ? >>> >>> constant TSHIRTS = 1 ; // 2 to the 0th power >>> constant JACKETS = 2 ; // 2 to the 1st power >>> constant MENS = 8 ; // 2 to the 3rd power >>> constant WOMENS = 16 ; // 2 to the girl power :-) >>> >>> INSERT INTO TABLE t_myTable ( ID, categoryField) >>> VALUES ( myNewId, TSHIRTS | MENS ) ; >>> >>> SELECT ID >>> FROM t_myTable >>> WHERE ( categoryField && ( TSHIRTS | MENS )) > 0 ; >>> >>> This assumes that your number of categories is not that big of course, as you're limited to 64 bits/categories on a modern machine. >>> >>> Bert >>> >>> -- >>> PHP Database Mailing List (http://www.php.net/) >>> To unsubscribe, visit: http://www.php.net/unsub.php >>> >> >> Hi Bert, >> Thanks for the response. I did consider that, but there may be more than 64 categories. >> So I am thinking that may not be best for my situation. I am actually at the same point again, but >> this time with the colors. I have multiple colors for each tshirt. >> I dont want to put all the separate colors as their own fields and there is an image associated with those colors too. >> I'd also like to not put those all in separate fields if I can. >> >> What's the best way to store multiple values that may change from time to time? >> What kind of field? >> >> IE: >> ('red.png', 'green.png', 'blue.png') >> >> SET() >> enum() >> blob() >> varchar() >> >> ??? >> TIA >> >> Karl DeSaulniers >> Design Drumm >> http://designdrumm.com >> >> >> -- >> PHP Database Mailing List (http://www.php.net/) >> To unsubscribe, visit: http://www.php.net/unsub.php >> > > > I am thinking of limiting the colors to 10 for now (after all there are only so many ways to die a shirt. =) > and using a comma delimited list of abbreviated color names as a varchar string. > Then read out that string, explode on the commas and put in an array. > > `pd_color` varchar(39) CHARACTER SET utf8 NOT NULL DEFAULT 'Blk,Wht,Gry,Tan,Nvy,Red,Grn,Yel,Org,Trq' > > With this I can dynamically call each different color file dependent on what's in the $colors[] array. > ... > $colors['Blk,Wht,Gry'] > foreach($colors as $color) { > ... get color for this iteration > $product = "Mens_Sample_".$color."_T.png"; //for eg. > ... > $image = "http://somewhere.com/images/products/".$product; > > and if I want to add colors, I can just change it to how ever many more characters + commas. > > ALTER TABLE... `pd_color` varchar(55) CHARACTER SET utf8 NOT NULL DEFAULT 'Blk,Wht,Gry,Tan,Nvy,Red,Grn,Yel,Org,Trq,Brk,Ptr,Sil,Tie' > > My thoughts are because it will be a string, it will be read by php out of MySQL fairly quickly and then php does the rest. > Am I headed for a headache or is this unconventional but OK or is this the way to go? Headache. Either use the MySQL set datatype or use a join table. Your way is a violation of the first normal form, which is generally a bad idea to do. Nit to mention slower. > Best, > > > Karl DeSaulniers > Design Drumm > http://designdrumm.com > > > > -- > PHP Database Mailing List (http://www.php.net/) > To unsubscribe, visit: http://www.php.net/unsub.php >