It's not as elegant as I wanted I got it to work this way.... (I must be
getting tired)
create temporary table projects_need
SELECT proj
, count(rsrc) as rsrc_count
FROM project
group by proj;
CREATE temporary table suppliers_match
select p.proj
, s.name
, count(s.name) as sup_count
from project p
left join people s /* s for supplier */
on s.rsrc = p.rsrc
group by 1,2;
select pn.proj
, sm.name
, pn.rsrc_count
, sm.sup_count
, sm.sup_count/pn.rsrc_count * 100.0 pct_match
from projects_need pn
inner join suppliers_match sm
on sm.proj = pn.proj
order by proj
, pct_match desc;
drop temporary table projects_need, suppliers_match;
+----------+---------+------------+-----------+-----------+
| proj | name | rsrc_count | sup_count | pct_match |
+----------+---------+------------+-----------+-----------+
| ark | noah | 2 | 2 | 100.00 |
| ark | davinci | 2 | 1 | 50.00 |
| ark | lincoln | 2 | 1 | 50.00 |
| cabin | lincoln | 1 | 1 | 100.00 |
| cabin | noah | 1 | 1 | 100.00 |
| jeans | davinci | 2 | 1 | 50.00 |
| jeans | noah | 2 | 1 | 50.00 |
| jeans | NULL | 2 | 0 | 0.00 |
| monalisa | davinci | 2 | 2 | 100.00 |
| monalisa | noah | 2 | 1 | 50.00 |
+----------+---------+------------+-----------+-----------+
You can change the condition of the last query to join on
rsrc_count=sup_count so that you only get full supply list matches but I
thought that having a completion % was an interesting by-product of my
method.
Shawn Green
Database Administrator
Unimin Corporation - Spruce Pine
Laszlo Thoth <[EMAIL PROTECTED]> wrote on 10/01/2004 11:53:23 AM:
> I'm having difficulty constructing a query. I've got two kinds of
> information:
> a table of resources that various people have, and a table of resources
that
> various projects need.
>
> =======================================================
> CREATE TABLE `people` (
> `name` varchar(11) default NULL,
> `rsrc` varchar(15) default NULL
> );
>
> INSERT INTO `people` VALUES
> ('noah','wood'),('noah','canvas'),('lincoln','wood'),
> ('davinci','canvas'),('davinci','paint');
>
> CREATE TABLE `project` (
> `proj` varchar(11) default NULL,
> `rsrc` varchar(15) default NULL
> );
>
> INSERT INTO `project` VALUES
> ('ark','wood'),('ark','canvas'),('cabin','wood'),
> ('monalisa','canvas'),('monalisa','paint'),('jeans','canvas'),
> ('jeans','sewingmachine');
> =======================================================
>
> I need a query that will tell me which people have the resources
required to
> complete a given project. Unfortunately all I can get are incomplete
matches:
> I'm not sure how to express the concept of "fully satisfying the
requirements"
> to MySQL.
>
> Restructuring the tables is allowed: I'm not tied to the current
> schema, I just
> need to solve the problem. The only limit is that resources must
bearbitrary:
> I can't use a SET to define resources because I might want to insert a
new
> resource at some future point without redefining the column type.
>
> I'm pretty sure this is a good starting point, but that's just
> matching resource
> to resource without excluding Lincoln from building an Ark (no canvas).
>
> mysql> SELECT project.proj,project.rsrc,people.name FROM project LEFT
JOIN
> people ON project.rsrc=people.rsrc;
> +----------+-------------+---------+
> | proj | rsrc | name |
> +----------+-------------+---------+
> | ark | wood | noah |
> | ark | wood | lincoln |
> | ark | canvas | noah |
> | ark | canvas | davinci |
> | cabin | wood | noah |
> | cabin | wood | lincoln |
> | monalisa | canvas | noah |
> | monalisa | canvas | davinci |
> | monalisa | paint | davinci |
> | jeans | canvas | noah |
> | jeans | canvas | davinci |
> | jeans | sewingmachi | NULL |
> +----------+-------------+---------+
>
> It would also be sufficient but less optimal to solve a subset of
> this problem,
> where I only determine "who could complete this project" for a single
project
> rather than trying to match all projects to all people in one query.
>
> --
> MySQL General Mailing List
> For list archives: http://lists.mysql.com/mysql
> To unsubscribe: http://lists.mysql.com/[EMAIL PROTECTED]
>