Thread: show data from two tables together

show data from two tables together

From
"Matthew Nuzum"
Date:
Well, this is somewhat of a follow up to my previous post regarding self
joins.  Now what I'm hoping to do is "virtually" combine the results
from two different record sets into one apparent record set.

Here is the skeleton of my application's data structure.  There is a
table called "folders" and a table called "files".

They look like:| files         | folders
=============   ============
x| fileid       x| folderid| filename      | foldername| folderid      | parentid| dsply_order   | dsply_order

files.folderid is fk to folders.folderid, folders.parentid is field for
self joining to folderid.

Now my difficulty is that I want to see results for the two tables
together.  As you know, folders can co-exist with files inside of a
folder.  Therefore if I know my current folder is 23, then I'd like to
SELECT * FROM files WHERE files.folderid = 23 AND SELECT * FROM folders
WHERE folders.parentid = 23 and then take the combined record sets and
ORDER BY dsply_order.

The only way that I know how to do this is to do two queries and put the
results into an array and sort it outside of postgres.  However my goal
is to make life simpler for the application developers and just give
them a view that has the data they need.

As a side note, I'd probably need to add a field that would indicate 1
if the file came from files otherwise count(folders.*) WHERE parentid =
folderid so that I can see if the folder is empty.

As another side note, this operation will be performed quite frequently
and should be fast.

As I think about it, it seems that the only logical way would be to do
this at the application level, not inside postgres.  Please correct me
if I'm wrong.

--
Matthew Nuzum
www.bearfruit.org
cobalt@bearfruit.org



Re: show data from two tables together

From
Stephan Szabo
Date:
On Wed, 15 Jan 2003, Matthew Nuzum wrote:

> Well, this is somewhat of a follow up to my previous post regarding self
> joins.  Now what I'm hoping to do is "virtually" combine the results
> from two different record sets into one apparent record set.

Fortunately we have the set functions, specifically UNION ALL in this
case.

> Here is the skeleton of my application's data structure.  There is a
> table called "folders" and a table called "files".
>
> They look like:
>  | files         | folders
> =============   ============
> x| fileid       x| folderid
>  | filename      | foldername
>  | folderid      | parentid
>  | dsply_order   | dsply_order
>
> files.folderid is fk to folders.folderid, folders.parentid is field for
> self joining to folderid.
>
> As a side note, I'd probably need to add a field that would indicate 1
> if the file came from files otherwise count(folders.*) WHERE parentid =
> folderid so that I can see if the folder is empty.
>
> As another side note, this operation will be performed quite frequently
> and should be fast.
>
> As I think about it, it seems that the only logical way would be to do
> this at the application level, not inside postgres.  Please correct me
> if I'm wrong.

Maybe something like (minus the number of files/empty part):

CREATE VIEW viewname ASSELECT fileid, filename, folderid, dsply_order FROM files UNION ALLSELECT folderid, foldername,
parentid,dsply_order FROM folders;
 

SELECT * from viewname where folderid=23 order by dsply_order;


Depending on whether you want a count of files or just an empty
or not, and whether you want info on whether a particular entry
is a file or folder, you'll probably need to add to the above.




Re: show data from two tables together

From
"Matthew Nuzum"
Date:
Hmm... I've never used this before.  I'll try it.

Thanks for your help and your quick reply!

--
Matthew Nuzum
www.bearfruit.org
cobalt@bearfruit.org

> Fortunately we have the set functions, specifically UNION ALL in this
> case.
> 

> Maybe something like (minus the number of files/empty part):
> 
> CREATE VIEW viewname AS
>  SELECT fileid, filename, folderid, dsply_order FROM files
>   UNION ALL
>  SELECT folderid, foldername, parentid, dsply_order FROM folders;
> 
> SELECT * from viewname where folderid=23 order by dsply_order;