I'm having trouble figuring out the logic/query I want.
I know that all those "OR"s are not right.
I'm doing this in PHP and mySQL (of course), 
so if it can't be done with a single query, I can split it up.

Here's the challenge, given a text field search box, someone enters:

        Sony 20" TV

How do I search for that, not knowing which fields are which?
For example, they could have also entered:

        20" Sony TV

This is the one I have now, but (as you probably noticed), it will return many 
rows,
I expect that most of the time > 1 row will be returned, but I'm getting a grip 
more than I want (or the customer would want), and
also rows that have nothing to do with the search terms.

SELECT products.*, companies.name AS company_name, categories.name AS 
category_name 
FROM     products 
         LEFT JOIN companies ON company_id = companies.id 
         LEFT JOIN categories ON category_id = categories.id 
WHERE  products.enabled = 1 
        AND( 
            (products.model LIKE 'sony%'   OR products.model LIKE '20%'  OR 
products.model LIKE 'tv%') 
         OR (products.upc LIKE 'sony'      OR products.upc LIKE '20'     OR 
products.upc LIKE 'tv') 
         OR (products.name LIKE '%sony%'   OR products.name LIKE '20%'   OR 
products.name LIKE '%tv%') 
         OR (companies.name LIKE 'sony%'   OR companies.name LIKE '20%'  OR 
companies.name LIKE 'tv%') 
         OR (categories.name LIKE '%sony%' OR categories.name LIKE '20%' OR 
categories.name LIKE '%tv%') 
        ) 
ORDER BY categories.name DESC, products.name ASC, companies.name ASC;

(and that just gets uglier the more words in the search)

+----+------------------+--------------+--------------+---------------+
| id | name             | model        | company_name | category_name |
+----+------------------+--------------+--------------+---------------+
|  1 | 20" TV           | STV20-KVR-HD | Sony         | Tube          | <---
|  2 | 36" TV           | STV36-KVR-HD | Sony         | Tube          | 
|  4 | Ultra-Plasma 62" | UP62F900     | Sony         | Plasma        | 
|  5 | Value Plasma 38" | VPR542_38    | Sony         | Plasma        | 
|  6 | Power-MP3 5gb    | 09834wuw34   | Sony         | MP3 Players   | 
|  3 | Super-LCD 42"    | SLCD42hd002  | Sony         | LCD           | 
|  7 | Super-Player 1gb | SP1gb        | Sony         | Flash         | 
|  8 | Porta CD         | pcd500       | Sony         | CD Players    | 
......
+----+------------------+--------------+--------------+---------------+

Obviously the person wanted id = 1 in this case.

Unrelated, is there any speed improvement using JOIN instead of LEFT JOIN ?
Think millions of products.

Thanks for help and suggestions...

Daevid.


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

Reply via email to