[EMAIL PROTECTED] wrote on 10/11/2005 01:27:12 PM:

> 
> 
> lets say i have two tables:
> 
> module
> ---------
> VARCHAR module_name
> INTEGER module_id
> 
> module_config
> ----------------
> INTEGER module_id
> VARCHAR config_name
> VARCHAR config_value
> 
> 
> config item names and values are rather arbitrary and depend on the 
module.
> 
> each module can have zero to many config items..
> 
> How do i find out the id of a module with the following two 
> module_config entries:
> config_name='mapping' and config_value='true'
> and 
> config_name='loc_enabled' and config_value='true'
> 
> it seems like i would have to use a subquery to check two rows at 
> the same time.  I wasn't really sure how to express it in SQL though.
> 

No need for a subquery. There are at least two ways. The most direct uses 
a self join but it does not scale well to more than two or three 
conditions to match

SELECT a.module_id
FROM module_config a
INNER JOIN module_config b
        on b.module_id = a.module_id
        and b.config_name = 'loc_enabled'
        and b.config_value = 'true'
WHERE a.config_name = 'mapping 
        and a.config_value='true';

The more flexible method is to use a COUNT() and a HAVING() to test for 
how many conditions each module_id matches. It scales much better to more 
than 2 or 3 conditions to match


SELECT module_id, count(1) as matches
FROM module_config
WHERE config_name IN ('loc_enabled', 'mapping')
        AND config_value='true'
GROUP BY module_id
HAVING matches = 2;

Make sense? If you need to reuse the list of module_id's in another query, 
just dump the results of this SELECT into a TEMPORARY TABLE and use them 
from there.

Shawn Green
Database Administrator
Unimin Corporation - Spruce Pine



Reply via email to