First, may I suggest a few changes to your original queries:

select
        u2.universityID as ID,
        u2.urltype as type,
        u4.username as user,
        u3.itemID as ID2,
        u1.ID as uID
from universityTBL as u1
join university_urlTBL as u2
        on u2.universityID = u1.ID
join parsefileTBL as p1
        on p1.university_urlID = u2.ID
join user_rolesTBL as u3
        on u3.itemID = u2.ID
        and u2.urltype = u3.itemType
join users as u4
        on u3.userID = u4.user_id
where u2.urltype IN (1,2)
        and u3.process = 20
        and u1.ID IN (40,102,257,267,379,394);

Changes:
        moved a conditional term linking u2 and u3 into the ON clause of 
the u3 JOIN
        Changed your OR lists into IN (,,)
        Removed quotes from around your numbers (They are not strings, 
don't quote them)


select 
        u1.universityID as ID
        , u1.urltype as type
        , p1.start_status as status
FROM parsefileTBL as p1 
INNER JOIN latestParseStatusTBL as l1 
        on p1.fileID = l1.itemID
LEFT JOIN university_urlTBL as u1 
        on p1.university_urlID = u1.ID
WHERE u1.universityID IN (40,102,257,267,379,394,460,541,560)

Changes:
        Moved your outer join to the end of your join list and converted 
the RIGHT join to a LEFT join.
        Changed your OR list into an IN(,,,)
        Unquoted the numbers

I question the logic of this last query. Because of the LEFT join, the 
WHERE condition is not applied until after the Cartesian product of ("p1" 
IJ "l1") LJ "u1" is built as a virtual table. You eliminate all 
non-matching rows from u1 by looking for a non-null value in the results. 
This query should move faster written as

select 
        u1.universityID as ID
        , u1.urltype as type
        , p1.start_status as status
FROM parsefileTBL as p1 
INNER JOIN latestParseStatusTBL as l1 
        on p1.fileID = l1.itemID
INNER JOIN university_urlTBL as u1 
        on p1.university_urlID = u1.ID
        and u1.universityID IN (40,102,257,267,379,394,460,541,560)


Now, to address the JOIN of the two queries so that the results of query 1 
are optionally matched with the rows of query 2

select 
        u1.universityID as ID
        , u1.urltype as type
        , p1.start_status as status
        , u4.username as user
        , u3.itemID as ID2
        , u1.ID as uID
FROM  university_urlTBL as u1 
INNER JOIN parsefileTBL as p1
        on p1.university_urlID = u1.ID
INNER JOIN latestParseStatusTBL as l1 
        on p1.fileID = l1.itemID
LEFT join user_rolesTBL as u3
        on u3.itemID = u2.ID
        and u2.urltype IN (1,2)
        and u2.urltype = u3.itemType
        and u3.process = 20
LEFT join users as u4
        on u3.userID = u4.user_id
WHERE u1.universityID IN (40,102,257,267,379,394,460,541,560)
ORDER BY 1,2,3


Notes:
1) You already had the first two columns the same for each query so I kept 
those tables joined the same way. The 3rd and 4th columns were optional 
data so the tables they source from are LEFT JOINed
2) The ON condition of the LEFT JOIN of user_rolesTBL has two conditions 
(u2.urltype... and u3.process...) that you may have considered putting 
into the WHERE clause. They belong in the ON clause of the join because 
those are two of the conditions by which we decide which rows are joined, 
not which rows do we return as results of the query.
3) I added an order by clause so that the report will format as you 
suggested (listed by ID, type, status)

Shawn Green
Database Administrator
Unimin Corporation - Spruce Pine




"bruce" <[EMAIL PROTECTED]> wrote on 09/29/2004 10:05:49 AM:

> hey shawn!!!
> 
> got your msg about helping speed up the mysql!!! thanks. i got to 
thinking
> that if the sql/interactions where the issue, why not rewrite the app to
> reduce the number of round trips to hit the db for a given page to be
> displayed..
> 
> the following sql statements are used to produce the two tables:
> 
------8<--snip--8<------- 
> sql
> t1:
> select
> u2.universityID as ID,
> u2.urltype as type,
> u4.username as user,
> u3.itemID as ID2,
> u1.ID as uID
> from universityTBL as u1
> join university_urlTBL as u2
> on u2.universityID = u1.ID
> join parsefileTBL as p1
> on p1.university_urlID = u2.ID
> join user_rolesTBL as u3
> on u3.itemID = u2.ID
> join users as u4
> on u3.userID = u4.user_id
> where u2.urltype = u3.itemType
> and (u2.urltype = '1' or u2.urltype='3')
> and u3.process = '20'
> and (u1.ID='40' or u1.ID='102' or u1.ID='257' or u1.ID='267'
> or u1.ID='379' or u1.ID='394');
> 
> t2:
> select u1.universityID as ID, u1.urltype as type, p1.start_status as 
status
> from university_urlTBL as u1 right join parsefileTBL as p1 on u1.ID =
> p1.university_urlID join latestParseStatusTBL as l1 on p1.fileID = 
l1.itemID
> where u1.universityID='40' or u1.universityID='102' or 
u1.universityID='257'
> or u1.universityID='267' or u1.universityID='379' or 
u1.universityID='394'
> or u1.universityID='460' or u1.universityID='541' or
> u1.universityID='560'....
> 
> 
> -----Original Message-----
> From: [EMAIL PROTECTED] [mailto:[EMAIL PROTECTED]
> Sent: Wednesday, September 29, 2004 6:42 AM
> To: [EMAIL PROTECTED]
> Cc: [EMAIL PROTECTED]
> Subject: Re: merging of two tables using temp tables???
> 
> 
> 
> If you post your two "original" SQL statements (the ones you use to 
build
> your example tables) I think I can help you to merge your results, 
possibly
> without the need for temporary tables. Also, what version of MySQL are 
you
> using?
> 
> Shawn Green
> Database Administrator
> Unimin Corporation - Spruce Pine
> 
> 
> "bruce" <[EMAIL PROTECTED]> wrote on 09/29/2004 12:57:34 AM:
> 
> > hi....
> >
> > i have a situation where i create the following tables via two 
different
> > select sql statements.
> >
> > +-----+------+-------+------+-----+
> > | ID  | type | user  | ID   | uID |
> > +-----+------+-------+------+-----+
> > |  40 |    1 | admin |  157 |  40 |
> > | 102 |    1 | admin |  405 | 102 |
> > | 257 |    1 | admin | 1025 | 257 |
> > | 267 |    1 | admin | 1065 | 267 |
> > | 379 |    1 | admin | 1513 | 379 |
> > +-----+------+-------+------+-----+
> > 5 rows in set (0.00 sec)
> >
> > +------+------+--------+
> > | ID   | type | status |
> > +------+------+--------+
> > |   40 |    1 |      0 |
> > |   40 |    2 |      0 |
> > |   40 |    3 |      0 |
> > |   40 |    4 |      0 |
> > |  102 |    1 |      0 |
> > |  102 |    2 |      0 |
> > |  102 |    3 |      0 |
> > |  102 |    4 |      0 |
> > |  257 |    1 |      0 |
> > |  257 |    2 |      0 |
> > |  257 |    3 |      0 |
> > |  257 |    4 |      0 |
> > |  267 |    1 |      0 |
> > |  267 |    2 |      0 |
> > |  267 |    3 |      0 |
> > |  267 |    4 |      0 |
> > |  379 |    1 |      0 |
> > |  379 |    2 |      0 |
> > |  379 |    3 |      0 |
> > |  379 |    4 |      0 |
> > |  394 |    1 |      0 |
> > |  394 |    2 |      0 |
> > |  394 |    3 |      0 |
> > |  394 |    4 |      0 |
> > |  460 |    1 |      0 |
> > |  460 |    2 |      0 |
> > |  460 |    3 |      0 |
> > |  460 |    4 |      0 |
> > |  541 |    1 |      0 |
> > |  541 |    2 |      0 |
> > |  541 |    3 |      0 |
> > |  541 |    4 |      0 |
> >
> >
> > i'd like to be able to merge/combine the two tables so that i get
> > +------+------+--------+------+-------+-----+
> > | ID   | type | status | user | ID    | uID |
> > +------+------+--------+------+-------+-----+
> > |   40 |    1 |      0 |
> > |   40 |    2 |      0 |          .
> > |   40 |    3 |      0 |          .
> > |   40 |    4 |      0 |
> > |  102 |    1 |      0 |
> > |  102 |    2 |      0 |
> > |  102 |    3 |      0 |
> > |  102 |    4 |      0 |
> >
> > with the appropriate information in the various columns/rows...
> >
> > i'm looking to be able to fill the resulting table with the 
information if
> > it's present, or to have nulls/'0' where the information isn't
> available...
> >
----8<--snip---8<------
> > MySQL General Mailing List
> > For list archives: http://lists.mysql.com/mysql
> > To unsubscribe: http://lists.mysql.com/[EMAIL PROTECTED]
> >
> 

Reply via email to