James Carrier wrote:
>
> Hi Amer
>
> Thanks for replying - I wonder if you could clear up a point for me.
> I'm going to have many, many possible multi values - too many for a SET or
> ENUM column as some other people have suggested.
> I'm happy using the following tables:
>
> parts (partid int, partname varchar(255))
> cats (catid int, catname varchar(255))
> parts_cats (id int, partid int, catid int)
>
> To track which categories are assigned to which parts. I can use the
> following query to return parts and associated categories:
>
> SELECT partid,catid,partname,catname FROM parts_cats
> LEFT JOIN parts ON parts_cats.partid=parts.partid
> LEFT JOIN cats ON parts_cats.catid=cats.catid
>
> However, as I won't know how many categories are assigned to a given part,
> how can I:
So from this are you saying that a given part may have multiple
categories? Can a category contain multiple parts? (many to many). That
is usually an indicator to split up the data into another table.
I suggest you try something like this:
1) add another field to parts (catid int) which reflects cats.catid
2) move the cats.catid to the new column in parts
3) delete parts_cats - it's now redundant
>
> a) Form a query that only returns a list of parts that match a specifc set
> of categories (e.g. 1=>CatA' AND 5=>'CatE' AND 26=>'CatZ' only)
>
> b) Know how many unique records I'm dealing with. Using the SQL above, if a
> part has, say, 3 categories then 3 rows would be returned. 4 categories and
> 4 rows are returned, etc. - how can I tell how big my result set is so that
> I can page through it using LIMIT?
Here's a dummy db I set up to play with this:
mysql> show tables;
+-------------------+
| Tables_in_carrier |
+-------------------+
| cats |
| parts |
+-------------------+
2 rows in set (0.00 sec)
mysql> describe cats;
+----------+------------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------+------------------+------+-----+---------+-------+
| cat_id | int(10) unsigned | YES | | NULL | |
| cat_name | varchar(255) | YES | | NULL | |
+----------+------------------+------+-----+---------+-------+
2 rows in set (0.00 sec)
mysql> describe parts;
+-----------+------------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-----------+------------------+------+-----+---------+-------+
| part_id | int(10) unsigned | YES | | NULL | |
| part_name | varchar(255) | YES | | NULL | |
| cat_id | int(10) unsigned | YES | | NULL | |
+-----------+------------------+------+-----+---------+-------+
3 rows in set (0.00 sec)
mysql> select * from cats;
+--------+------------+
| cat_id | cat_name |
+--------+------------+
| 101 | oneohone |
| 102 | oneohtwo |
| 103 | oneohthree |
| 104 | oneohfour |
+--------+------------+
4 rows in set (0.00 sec)
mysql> select * from parts order by part_id;
+---------+-----------+--------+
| part_id | part_name | cat_id |
+---------+-----------+--------+
| 1 | one | 101 |
| 1 | one | 102 |
| 2 | two | 102 |
| 2 | two | 104 |
| 3 | three | 103 |
| 3 | three | 104 |
| 4 | four | 103 |
| 5 | five | 101 |
| 6 | six | 102 |
+---------+-----------+--------+
9 rows in set (0.00 sec)
mysql> select * from parts
-> where cat_id=101 or cat_id=104
-> order by part_id;
+---------+-----------+--------+
| part_id | part_name | cat_id |
+---------+-----------+--------+
| 1 | one | 101 |
| 2 | two | 104 |
| 3 | three | 104 |
| 5 | five | 101 |
+---------+-----------+--------+
4 rows in set (0.00 sec)
mysql> select * from parts
-> where cat_id=101 or cat_id=102;
+---------+-----------+--------+
| part_id | part_name | cat_id |
+---------+-----------+--------+
| 1 | one | 101 |
| 5 | five | 101 |
| 2 | two | 102 |
| 6 | six | 102 |
| 1 | one | 102 |
+---------+-----------+--------+
5 rows in set (0.00 sec)
mysql> select * from parts
-> where part_id=3;
+---------+-----------+--------+
| part_id | part_name | cat_id |
+---------+-----------+--------+
| 3 | three | 103 |
| 3 | three | 104 |
+---------+-----------+--------+
2 rows in set (0.00 sec)
mysql> select * from parts
-> where part_id=1;
+---------+-----------+--------+
| part_id | part_name | cat_id |
+---------+-----------+--------+
| 1 | one | 101 |
| 1 | one | 102 |
+---------+-----------+--------+
2 rows in set (0.00 sec)
mysql> select * from parts
-> where part_id=4;
+---------+-----------+--------+
| part_id | part_name | cat_id |
+---------+-----------+--------+
| 4 | four | 103 |
+---------+-----------+--------+
1 row in set (0.00 sec)
In PHP, to get the number of rows affected you can do something like
this ...
$query=("SELECT Artist
FROM Artists
WHERE Artist LIKE \"%$InArtist%\" ");
$result=mysql_query($query);
if (!$result)
{
die ("query failed.");
}
$ArtistCount=mysql_num_rows($result);
Hope this helps somewhat.
--
Amer Neely, Softouch Information Services
W: www.softouch.on.ca
E: [EMAIL PROTECTED]
V: 519.438.5887
Perl | PHP | MySQL | CGI programming for shopping carts, data entry
forms.
"We make web sites work!"
---------------------------------------------------------------------
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