Graham Anderson <[EMAIL PROTECTED]> wrote on 04/13/2005 01:46:35 PM:

> Hi
> I am trying to set up my Match statements to filter the result of the 
> main query [which works]
> 
> If 'chris' does not exist in the first MATCH statement [AND MATCH 
> (media.name, media.product)], then the results get a bit screwed up :( 
> If the first match statement finds something, then the query works 
> fine....
> 
> What would be a better way to structure this...without using a subquery 
> as I am on MYSQL 3.23
> 
> 
> SELECT media.id, media.product AS product, media.name AS name, 
> Concat_WS( ' ', artist.fname, artist.lname ) AS artist, mediaType.id AS 
> mediatype, mediaType.name, media.product, media.path
> FROM media, artist, mediaType
> WHERE media.artist_id = artist.id
> AND media.mediaType_id = mediaType.id
> 
> AND MATCH (
> media.name, media.product
> )
> AGAINST (
> 'chris'
> )
> OR MATCH (
> artist.fname, artist.lname
> )
> AGAINST (
> 'chris'
> )
> ORDER BY product, media.name, artist ASC
> LIMIT 0 , 30
> 
> 
it's a parentheses issue. Your query looks like this in the where clause

WHERE artist_ID AND mediaType_ID AND first match OR second match

Which gets evaluated like

WHERE (artist_ID AND mediaType_ID AND first match) OR second match.

Any record that matched your second match condition also satisfied your 
WHERE clause. Because you wanted to match on artist_Id and mediaType_ID 
plus one of the match conditions, you needed to put a set of parentheses 
around BOTH of your match conditions so that your WHERE clause looked 
like:

WHERE artist_ID AND mediaType_ID AND (first match OR second match)

Here is an updated version of your original query (I also changed your 
implicit inner joins to explicit ones (it's a pet peeve)):

SELECT media.id, media.product AS product
        , media.name AS name
        , Concat_WS( ' ', artist.fname, artist.lname ) AS artist
        , mediaType.id AS mediatype
        , mediaType.name
        , media.product
        , media.path
FROM media
INNER JOIN mediaType
        ON media.mediaType_id = mediaType.id
INNER JOIN artist
        ON media.artist_id = artist.id
WHERE MATCH (media.name, media.product)
        AGAINST ('chris')
OR MATCH (artist.fname, artist.lname)
        AGAINST ('chris')
ORDER BY product, media.name, artist ASC
LIMIT 0 , 30


Shawn Green
Database Administrator
Unimin Corporation - Spruce Pine

Reply via email to