Re: difficult select problem

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



PJ wrote:
I've searched the web, the tutorials, etc. with no luck and have asked
on MySql list with no luck and have even posted here with no replies.
So, let's try again:

I am trying to limit the search for books to only those that start with
"A" (does not have to be case sensitive); but within that selection
there may be a second author whose name may start with any letter of the
alphabet.

So, the real problem is to find if there is a second author in the
selection of books and to display that name.
My query shows all the books that begin with A:

$SQL = "SELECT b.*, c.publisher, a.first_name, a.last_name
        FROM book AS b
        LEFT JOIN book_publisher as bp ON b.id = bp.bookID
        LEFT JOIN publishers AS c ON bp.publishers_id = c.id
        LEFT JOIN book_author AS ba ON b.id = ba.bookID
LEFT JOIN author AS a ON ba.authID = a.id WHERE LEFT(last_name, 1 ) = '$Auth' ";

Within the results there are some books that have 2 authors and now I have to find if
there is a second author in the results and then be able to echo the second author.
So far, I have not been able to figure out how to go about that.
Do I need to do another query to find the second author or can it somehow be incorporated into the original query? Or can it be done with a UNION ?

Union won't help because you don't know the results from the first query to put into the union.

You could do it in one query but whether it's worth it is up to you to decide & test. I've removed the "book_publisher" stuff to make it easier to understand.


Step 1:
get the books the author has written. You don't need to join all of the tables here because you only want the bookid's.

select
 bookid
from
 book_author ba
 inner join
 authors a on (ba.authorid=a.id)
where
 left (last_name, 1) = 'A'

Step 2:

Get all authors for those books:

select
  ba.*
from
  book_author ba
  inner join
  authors a on (ba.authorid=a.id)
where
  ba.bookid in
(
  select
    bookid
  from
    book_author ba
    inner join
    authors a on (ba.authorid=a.id)
  where
   left (last_name, 1) = 'A'
);


They should be inner joins, not left joins.

If you need to join to other tables (book_publishers etc) don't do it in the inner query, do it in the outer (select ba.* stuff).

--
Postgresql & php tutorials
http://www.designmagick.com/


--
PHP General Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php


[Index of Archives]     [PHP Home]     [Apache Users]     [PHP on Windows]     [Kernel Newbies]     [PHP Install]     [PHP Classes]     [Pear]     [Postgresql]     [Postgresql PHP]     [PHP on Windows]     [PHP Database Programming]     [PHP SOAP]

  Powered by Linux