[plug] OK, for all of you SQL gurus out there...

Arkem Paul arkem at mornmist.com
Thu May 26 10:40:02 WST 2005

Andrew Furey wrote:
> I have a MySQL database containing a table with the following
> structure (CSVd for email):
> fieldId, objectId, value
> -------
> foo, 101, "Some text"
> bar, 101, 1
> foo, 102, "Some text"
> bar, 102, 0
> foo, 103, "Another string"
> bar, 103, 1

I don't like this table, you really should consider a unique primary key 
for this table (unless you're using a composite key of fieldID and 
objectID). Also value should probably be two fields since you're storing 
two different types of data in it.

> I'm hoping to construct a _single query_ (the calling object doesn't
> have any processing capabilities as it stands, so no intermediate Perl
> variables etc) whereby I can return "101", since that is the only
> objectId that has "foo" equal to "Some text" AND "bar" equal to 1
> (boolean usage).
> SELECT objectId FROM thetable WHERE fieldId = 'bar' AND value = '1'
> AND objectId = (SELECT objectId FROM thetable WHERE fieldID = 'foo'
> AND value = 'Some text');

This statement below is what you want (don't take my word for it!) it 
performs a subquery to create a set of objectID that satisfies one 
condition and then uses a set membership check to test for the condition 
as part of the other conditions.

   WHERE fieldID = 'bar'
   AND value = '1'
   AND objectID IN (SELECT objectID
     FROM thetable WHERE fieldID = 'foo'
     AND value LIKE '__%')

This is untested but it returns objectID if (fieldID = 'bar' and 
value='1') and objectID is in the set of objectID that (fieldID = 'foo' 
and value is a string of at least 2 characters)

The '__%' is a mysql wildcard string search where _ represents exactly 1 
character and % represents any number of characters.


More information about the plug mailing list