Hello.

I've got a tricky problem on my hands. It seems very easy, but I can't figure it out 
anyway, 
and I've already spent quite some time trying to solve it! I'm doing the whole thing 
under 
MySQL 4.0, which seems to be the real problem here! It doesn't support my query I 
wrote! Well, I didn't run the query, but I know it'd never work!

Anyway, I'll get to the point. Here's a very simplified version of the tables I'm 
working on.


Car
-----------------------------------------
| ID | IDBrand | IDModel | Year | Price |
-----------------------------------------


Characteristic
--------------------
| ID | Description |
--------------------


CarCharacteristics
--------------------
| IDCar | IDCharac |
--------------------


These tables can be described the following way:
 Car
   * contains cars

 Characteristic
   * contains various characteristics that can be applied to a car
           - A/C, Winter Tyres, Electric Windows, ABS Brakes, etc.

 CarCharacteristics
   * indicates what characteristics the various cars actually have.


What I'd like to do, is to find which cars have a specific SET of characteristics. I'd 
like to 
be able to say which cars have the Characteristics 'X', 'Y' and 'Z' in ONE query. I'm 
using 
PHP to run the queries, but that isn't all that important, as I intend to let all the 
processing 
being done by the DBMS, or, alternatively, run various queries only passing the 
resulting 
identifiers directly in the new query.

For now, the only real implementation I have is an OR query, that is, I can find which 
Cars have AT LEAST ONE of the characteristics in the desired set.

I'm capable of solving the problem with N queries for each car, but this kind of 
solution 
seems very time consuming for a database with even as little as a few thousands of 
cars 
with around a dozen, or more, characteristics each.

I believe that the following query would solve my problem, but unfortunately it's not 
supported by MySQL MyISAM tables, and there are a couple of things about the query 
that I don't know how to "translate" into a valid MySQL Query. I think that this query 
would run just fine on an Oracle or DB2 system (maybe changing MINUS with EXCEPT, 
but that's all).


SELECT A.*
FROM car as A
WHERE (
        (
          SELECT B.ID
          FROM Characteristic AS B 
          WHERE B.ID IN('X','Y','Z')

          MINUS

          SELECT C.IDCharac
          FROM CarCharacteristics AS C
          WHERE C.IDCar=A.ID
        ) IS NULL
);



I appreciate any help in advance!
Remi Mikalsen


PS. I'm sorry if tables and other aligned elements don't appear correctly!

--
Remi Mikalsen
E-Mail: [EMAIL PROTECTED]
URL:    http://www.iMikalsen.com





-- 
MySQL General Mailing List
For list archives: http://lists.mysql.com/mysql
To unsubscribe:    http://lists.mysql.com/[EMAIL PROTECTED]

Reply via email to