Google Answers Logo
View Question
 
Q: Rewriting a SQL Query ( No Answer,   3 Comments )
Question  
Subject: Rewriting a SQL Query
Category: Computers > Programming
Asked by: jlgutez-ga
List Price: $15.00
Posted: 22 May 2006 10:59 PDT
Expires: 21 Jun 2006 10:59 PDT
Question ID: 731355
I?m trying to rewrite a SQL to use with MySQL 4.0 version (no subqueries).

The database structure is as follows:


Book
------------
ID
Title
Author


WordRel
-------------
WordIdxID
BookID


WordIdx
-------------
WordIdxID
Word


SELECT Book.Title 
FROM WordIdx, WordRel, Book 
WHERE Book.ID=WordRel.BookID 
    AND WordRel.WordIdxID=WordIdx.WordIdxID 
    AND WordIdx.Word=:Word1
    AND WordRel.BookID IN 
           (SELECT WordRel.BookID 
             FROM WordRel, WordIdx 
             WHERE Word.Rel.WordClave=WordIdx.WordIdxID 
             AND WordIdx.Word=:Word2)
ORDER BY Book.Title ASC


This is a database that keeps records of Books, and this query is
intended to search for books that contains the words word1 and word2. 
I have this query running on MSSQL.  I am trying to get it running on
MySQL but the version that is installed on my server does not support
subqueries.

Questions:

1. Is it possible to rewrite this query with no subqueries???
2. If so, how can I include a word3 to the query???


Thank you


José Gutiérrez
Answer  
There is no answer at this time.

Comments  
Subject: Re: Rewriting a SQL Query
From: fmaz-ga on 22 May 2006 19:31 PDT
 
Try this:

SELECT Book.Title 
FROM WordRel as wr
LEFT JOIN WordIdx as wi ON (wi.WordIdxID=wr.WordIdxID)
LEFT JOIN Book as b ON (b.id=wr.BookID)
WHERE wi.Word IN('Word1','Word2')
ORDER BY b.Title ASC;
Subject: Re: Rewriting a SQL Query
From: fmaz-ga on 22 May 2006 19:34 PDT
 
Hum, sorry, I think this will work better:

SELECT b.Title 
FROM WordIdx as wi
LEFT JOIN WordRel as wr ON (wr.WordIdxID=wi.WordIdxID)
LEFT JOIN Book as b ON (b.id=wr.BookID)
WHERE wi.Word IN('Word1','Word2')
ORDER BY b.Title ASC;
Subject: Re: Rewriting a SQL Query
From: mfripp-ga on 24 May 2006 10:51 PDT
 
I'm going to assume two things:
(1) That the :Word1 and :Word2 markers are memory variables. These
would be written as @Word1 and @Word2 in MySQL.
(2) That the expression Word.Rel.WordClave=WordIdx.WordIdxID in the
subquery should actually be WordRel.WordIdxID=WordIdx.WordIdxID as in
your main query (since you haven't defined a table called Word.Rel or
a column called WordClave anywhere).

The previous commenter's queries will get books that match _any_ of
the search words. This query will get books that match _all_ of the
search words:

SELECT Book.Title 
FROM Book, 
    WordIdx wi1, WordRel wr1, 
    WordIdx wi2, WordRel wr2,
    WordIdx wi3, WordRel wr3 (, ...) 
WHERE Book.ID=Wr1.BookID 
    AND Wr1.WordIdxID=Wi1.WordIdxID AND Wi1.Word=@Word1
    AND Wr2.BookID=Wr1.BookID 
    AND Wr2.WordIdxID=Wi2.WordIdxID AND Wi2.Word=@Word2
    AND Wr3.BookID=Wr1.BookID 
    AND Wr3.WordIdxID=Wi3.WordIdxID AND Wi3.Word=@Word3
    (...)
ORDER BY Book.Title ASC

You may be able to speed up this query by using a single table instead
of the WordRel and WordIdx tables. This table would have the fields
Word and BookID. You wouldn't waste that much extra space by repeating
the words for each book they appear in, and this would allow MySQL to
search a single table, instead of cross-linking two. Very likely it
could return the results it needed directly from the table index,
without ever looking into the table itself.

Important Disclaimer: Answers and comments provided on Google Answers are general information, and are not intended to substitute for informed professional medical, psychiatric, psychological, tax, legal, investment, accounting, or other professional advice. Google does not endorse, and expressly disclaims liability for any product, manufacturer, distributor, service or service provider mentioned or any opinion expressed in answers or comments. Please read carefully the Google Answers Terms of Service.

If you feel that you have found inappropriate content, please let us know by emailing us at answers-support@google.com with the question ID listed above. Thank you.
Search Google Answers for
Google Answers  


Google Home - Answers FAQ - Terms of Service - Privacy Policy