>The only problem I see is when there are concurrent access to the table
>"livreTemp", e.g. when there are multiple simultaneous requests of that
>kind.  Is there a better way for achieving this under mySQL 3?

Yes, concurrent access would be a problem. I think I have the answer using a
single query (see below).

I used the ObjectStar RDBMS which has temp (TEM) and session (SES) table
types. Both were specific to the client (a private memory as opposed to a
all user memory). This was very useful, but I've found no mention of it in
the mysql documentation.




// the 2 step query that works...


CREATE TABLE livreTemp (IDLivre int(11));

INSERT INTO livreTemp (IDLivre)
SELECT book.IDLivre
FROM livre book, livreEcritPar ecr, auteur aut
WHERE aut.Prenom like '%$firstName%'
AND aut.Nom like '%$lastName%'
AND ecr.IDAuteur = aut.IDAuteur
AND book.IDLivre = ecr.IDLivre;

SELECT book.IDLivre, aut.Prenom, aut.Nom
FROM livreTemp book, livreEcritPar ecr, auteur aut
WHERE ecr.IDLivre= book.IDLivre
AND aut.IDAuteur=ecr.IDAuteur;



// workout what tables and fields are used...

livre book           book
  IDLivre            book id

livreEcritPar ecr    book written by
  IDAuteur           author id
  IDLivre            book id

auteur aut           author
  IDAuteur           author id
  Prenom             firstname
  Nom                lastName



// create table sql...

drop table if exists livre;
create table livre (
  IDLivre int(11),
  title varchar(50),
  PRIMARY KEY (IDLivre)
);

drop table if exists livreEcritPar;
create table livreEcritPar (
  IDAuteur int(11),
  IDLivre int(11)
);

drop table if exists auteur;
create table auteur (
  IDAuteur int(11),
  Prenom varchar(50),
  Nom varchar(50),
  PRIMARY KEY (IDAuteur)
);



// create some test data...

insert into livre (IDLivre,title) values('1','howto: MySQL');
insert into livre (IDLivre,title) values('2','howto: PHP');
insert into livre (IDLivre,title) values('3','History of Tayport');
insert into livre (IDLivre,title) values('4','History of Perth');
insert into livre (IDLivre,title) values('5','British Politics v French
Politics');

insert into livreEcritPar (IDAuteur,IDLivre) values('1','1');
insert into livreEcritPar (IDAuteur,IDLivre) values('1','2');
insert into livreEcritPar (IDAuteur,IDLivre) values('1','3');
insert into livreEcritPar (IDAuteur,IDLivre) values('3','4');

insert into auteur (IDAuteur,Prenom,Nom) values('1','Matthew','Gold');
insert into auteur (IDAuteur,Prenom,Nom) values('2','Jim','Smith');
insert into auteur (IDAuteur,Prenom,Nom) values('3','Scott','Another');



// workout what the query has to return...


select all book.id's
from book, book written by, author
where author.first_name like ...
and author.last_name like ...
and book written by.id = author.id
and book.id = book written by.id

select book.id, author.first_name, author.last_name
from temp, book written by, author
where book written by.id = book.id
and author.id = book written by.id


// okay, but it in plain english?

select book.id, author.first_name, author.last_name

where author.first_name like ... and author.last_name like ...


// thoughts...

we don't need to look at the livre (book) table, because book id exists in
the livreEcritPar (book written by) table. now our query is just concerned
with two tables.

livreEcritPar (book written by)
and,
auteur (author)


// solution 1: english version...

select book written by.book id, author.first_name, author.last_name
  from author, book written by
  where author.first_name like ...
    and author.last_name like ...
    and book written by.author id = author.author id;


// solution 1: french version...

select livreEcritPar.IDLivre, auteur.Prenom, auteur.Nom
  from auteur, livreEcritPar
  where auteur.Prenom like 'Matthew%'
    and auteur.Nom like '%'
    and livreEcritPar.IDAuteur = auteur.IDAuteur;

+---------+---------+------+
| IDLivre | Prenom  | Nom  |
+---------+---------+------+
|       1 | Matthew | Gold |
|       2 | Matthew | Gold |
|       3 | Matthew | Gold |
+---------+---------+------+
3 rows in set (0.02 sec)



// more thoughts...

what if he actually wanted the book title? we'll need to look at all three
tables



// solution 2: english version...

select book.title, author.first_name, author.last_name
  from author, book written by, book
  where author.first_name like ...
    and author.last_name like ...
    and book written by.author id = author.author id
    and book.book id = book written by.book id;


// solution 2: french version...

select livre.title, auteur.Prenom, auteur.Nom
  from auteur, livreEcritPar, livre
  where auteur.Prenom like 'Matthew%'
    and auteur.Nom like '%'
    and livreEcritPar.IDAuteur = auteur.IDAuteur
    and livre.IDLivre = livreEcritPar.IDLivre;

+--------------------+---------+------+
| title              | Prenom  | Nom  |
+--------------------+---------+------+
| howto: MySQL       | Matthew | Gold |
| howto: PHP         | Matthew | Gold |
| History of Tayport | Matthew | Gold |
+--------------------+---------+------+
3 rows in set (0.02 sec)









----- Original Message -----
From: "Pascal Délisle" <[EMAIL PROTECTED]>
To: <[EMAIL PROTECTED]>
Sent: Sunday, August 03, 2003 8:02 PM
Subject: Re: Nested SELECT statements problem


Finally, I solved my problem by creating a temporary table that holds
the result of the subquery.  So, it looks like this:


CREATE TABLE livreTemp (IDLivre int(11));

INSERT INTO livreTemp (IDLivre) SELECT book.IDLivre
FROM livre book, livreEcritPar ecr, auteur aut WHERE aut.Prenom like
'%$firstName%' AND aut.Nom like '%$lastName%' AND ecr.IDAuteur =
aut.IDAuteur AND book.IDLivre = ecr.IDLivre;

SELECT book.IDLivre, aut.Prenom, aut.Nom FROM livreTemp book,
livreEcritPar ecr, auteur aut WHERE ecr.IDLivre= book.IDLivre AND
aut.IDAuteur=ecr.IDAuteur;

DROP TABLE livreTemp;


The only problem I see is when there are concurrent access to the table
"livreTemp", e.g. when there are multiple simultaneous requests of that
kind.  Is there a better way for achieving this under mySQL 3?

Le dimanche, 3 aoû 2003, à 12:41 Canada/Eastern, Pascal Délisle a écrit
:

> Thanks for your input!
>
> First, I removed the quotation marks into the sub-query in order to
> fix syntax.  Then, I tried to use different alliases from the main
> query.  However, this doesn't work.  I mean that mySQL return a syntax
> error.  I checked the server version and it is 3.23.56.  As someone
> else noticed, nested queries are not supported in mySQL until version
> 4 or so.  Therefore, I assume that it would not work for me.  Since
> I'm not the administrator of the mySQL server, I'm not able to upgrade
> it.  So, I'm stucked with version 3.23.56.
>
> Now, someone suggested me to replace subqueries with something like
> this:  http://www.mysql.com/doc/en/ANSI_diff_Sub-selects.html .
> However, I'm not able to figure out how to change my queries.  Any
> idea?
>
>
>
>
> Le dimanche, 3 aoû 2003, à 01:07 Canada/Eastern, Lin Yu a écrit :
>
>> One problem is that you have quoted your "sub-query", which makes it
>> to return a
>> constant string.
>>
>> Another problem I saw in your code is that you used the same aliases
>> for tables
>> in the query and in the sub-query.  In such case, the SQL parser
>> would take all
>> of them to refer to the same table, probably the ones in the query. My
>> suggestion would be to use different aliases in the query and
>> sub-query for the
>> same table. That way, in each of your where-clause, the SQL parser
>> will know
>> exactly which table reference you want.
>>
>> Also, be sure that your data is good so that your sub-query indeed
>> returns some
>> records to be matched; or otherwise the query will not return
>> anything.
>>
>> Hope this helps.
>> ________________________
>> Lin
>> -----Original Message-----
>> From: Pascal Délisle [mailto:[EMAIL PROTECTED]
>> Sent: Saturday, August 02, 2003 11:46 PM
>> To: [EMAIL PROTECTED]
>> Subject: Nested SELECT statements problem
>>
>> Hi!
>>
>> I try to figure out how to use a nested "SELECT" statement after the
>> "IN" predicate.  For example, when I try this code, it doesn't return
>> anything although it should:
>>
>>
>> SELECT book.IDLivre, aut.Prenom, aut.Nom FROM livre book,
>> livreEcritPar
>> ecr, auteur aut WHERE ecr.IDLivre  book.IDLivre AND aut.IDAuteur
>> ecr.IDAuteur AND book.IDLivre IN ("SELECT book.IDLivre FROM livre >
>> book,
>> livreEcritPar ecr, auteur aut WHERE aut.Prenom like '%$firstName%' AND
>> aut.Nom like '%$name%' AND ecr.IDAuteur  aut.IDAuteur AND book.IDLivre
>>  ecr.IDLivre");
>>
>>
>> So, my question is the following:  How should I change syntax in order
>> to make this bunch of code work?  I mean, under Oracle SQL, this
>> syntax
>> would be legal and work perfectly, so I'm confused how to solve my
>> problem.
>>
>> Thanks in advance!
>>
>>
>> --
>> MySQL General Mailing List
>> For list archives: http://lists.mysql.com/mysql
>> To unsubscribe:
>> http://lists.mysql.com/[EMAIL PROTECTED]
>
>
> --
> MySQL General Mailing List
> For list archives: http://lists.mysql.com/mysql
> To unsubscribe:
> http://lists.mysql.com/[EMAIL PROTECTED]
>


---
Outgoing mail is certified Virus Free.
Checked by AVG anti-virus system (http://www.grisoft.com).
Version: 6.0.506 / Virus Database: 303 - Release Date: 01/08/2003



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

Reply via email to