Query from two tables return error

Started by arnaud gabouryabout 10 years ago6 messagesgeneral
Jump to latest
#1arnaud gaboury
arnaud.gaboury@gmail.com

I have one table email.mail.mailusers :

Table "email.mailusers"
Column | Type |
Modifiers | Storage
| Stats target | Description
-------------+--------------------------+---------------------------------------------+--------
--+--------------+-------------
username | text | not
null | extende
d | |
password | text | not
null | extende
d | |
domain_name | text | not null default '
thetradinghall.com'::text | extende
d | |
created | timestamp with time zone | not null default
now() | plain
| |
Indexes:
"mailusers_pkey" PRIMARY KEY, btree (username, domain_name)
Foreign-key constraints:
"mailusers_domain_fk" FOREIGN KEY (domain_name) REFERENCES
email.domainlist(domain_name)

username | password | domain_name | created
----------------+--------------------------------------------------------------+---------------
arnaud.gaboury | XXXXYYYYYY | thetradinghall.com | 2016-02-04
09:48:58.834774+01

admin |XXXYYYYYY | thetradinghall.com | 2016-03-29
09:58:14.599743+02

postmaster | XXXYYYYYY | thetradinghall.com | 2016-03-31
16:36:18.96176+02

----------------------------------------------------------

I have one view email.mail_dir :

View "email.mail_dir"
Column | Type | Modifiers | Storage | Description
----------+------+-----------+----------+-------------
home_dir | text | | extended |
View definition:
SELECT ((mailusers.domain_name || '/'::text) || mailusers.username) ||
'/'::text AS home_dir
FROM email.mailusers;

home_dir
------------------------------------
thetradinghall.com/arnaud.gaboury/
thetradinghall.com/admin/
thetradinghall.com/postmaster/

---------------------------------------------

What I am trying to do: I want the <home_dir> be returned for <username> u.

The query :
SELECT d.home_dir
FROM email.mail_dir d, email.mailusers u
WHERE u.username='arnaud.gaboury';

But it returns:
home_dir
------------------------------------
thetradinghall.com/arnaud.gaboury/
thetradinghall.com/admin/
thetradinghall.com/postmaster/
(3 rows)

It is obviously not what I expect. I am expecting one answer in this case:
thetradinghall.com/arnaud.gaboury/

Thank you for any help. I have been trying with no sucess. Maybe one
solution could be to create a new view with <home_dir> | username as
columns ?

--

google.com/+arnaudgabourygabx
<https://plus.google.com/_/notifications/emlink?emr=05814804238976922326&amp;emid=CKiv-v6PvboCFcfoQgod6msAAA&amp;path=%2F116159236040461325607%2Fop%2Fu&amp;dt=1383086841306&amp;ub=50&gt;

#2arnaud gaboury
arnaud.gaboury@gmail.com
In reply to: arnaud gaboury (#1)
Re: Query from two tables return error

On Fri, Apr 1, 2016 at 11:33 AM, arnaud gaboury <arnaud.gaboury@gmail.com>
wrote:

I have one table email.mail.mailusers :

Table "email.mailusers"
Column | Type |
Modifiers | Storage
| Stats target | Description

-------------+--------------------------+---------------------------------------------+--------
--+--------------+-------------
username | text | not
null | extende
d | |
password | text | not
null | extende
d | |
domain_name | text | not null default '
thetradinghall.com'::text | extende
d | |
created | timestamp with time zone | not null default
now() | plain
| |
Indexes:
"mailusers_pkey" PRIMARY KEY, btree (username, domain_name)
Foreign-key constraints:
"mailusers_domain_fk" FOREIGN KEY (domain_name) REFERENCES
email.domainlist(domain_name)

username | password | domain_name | created

----------------+--------------------------------------------------------------+---------------
arnaud.gaboury | XXXXYYYYYY | thetradinghall.com | 2016-02-04
09:48:58.834774+01

admin |XXXYYYYYY | thetradinghall.com | 2016-03-29
09:58:14.599743+02

postmaster | XXXYYYYYY | thetradinghall.com | 2016-03-31
16:36:18.96176+02

----------------------------------------------------------

I have one view email.mail_dir :

View "email.mail_dir"
Column | Type | Modifiers | Storage | Description
----------+------+-----------+----------+-------------
home_dir | text | | extended |
View definition:
SELECT ((mailusers.domain_name || '/'::text) || mailusers.username) ||
'/'::text AS home_dir
FROM email.mailusers;

home_dir
------------------------------------
thetradinghall.com/arnaud.gaboury/
thetradinghall.com/admin/
thetradinghall.com/postmaster/

---------------------------------------------

What I am trying to do: I want the <home_dir> be returned for <username> u.

The query :
SELECT d.home_dir
FROM email.mail_dir d, email.mailusers u
WHERE u.username='arnaud.gaboury';

But it returns:
home_dir
------------------------------------
thetradinghall.com/arnaud.gaboury/
thetradinghall.com/admin/
thetradinghall.com/postmaster/
(3 rows)

It is obviously not what I expect. I am expecting one answer in this
case: thetradinghall.com/arnaud.gaboury/

Thank you for any help. I have been trying with no sucess. Maybe one
solution could be to create a new view with <home_dir> | username as
columns ?

EDIT : I found a solution with creating a new view this way:

SELECT domain_name||'/'||username||'/' AS home_dir,username
FROM email.mailusers;

home_dir | username
------------------------------------+----------------
thetradinghall.com/arnaud.gaboury/ | arnaud.gaboury
thetradinghall.com/admin/ | admin
thetradinghall.com/postmaster/ | postmaster

Now I can pick up the home_dir for username u.

#3Sándor Daku
daku.sandor@gmail.com
In reply to: arnaud gaboury (#1)
Re: Query from two tables return error

On 1 April 2016 at 11:33, arnaud gaboury <arnaud.gaboury@gmail.com> wrote:

I have one table email.mail.mailusers :

Table "email.mailusers"
Column | Type |
Modifiers | Storage
| Stats target | Description

-------------+--------------------------+---------------------------------------------+--------
--+--------------+-------------
username | text | not
null | extende
d | |
password | text | not
null | extende
d | |
domain_name | text | not null default '
thetradinghall.com'::text | extende
d | |
created | timestamp with time zone | not null default
now() | plain
| |
Indexes:
"mailusers_pkey" PRIMARY KEY, btree (username, domain_name)
Foreign-key constraints:
"mailusers_domain_fk" FOREIGN KEY (domain_name) REFERENCES
email.domainlist(domain_name)

username | password | domain_name | created

----------------+--------------------------------------------------------------+---------------
arnaud.gaboury | XXXXYYYYYY | thetradinghall.com | 2016-02-04
09:48:58.834774+01

admin |XXXYYYYYY | thetradinghall.com | 2016-03-29
09:58:14.599743+02

postmaster | XXXYYYYYY | thetradinghall.com | 2016-03-31
16:36:18.96176+02

----------------------------------------------------------

I have one view email.mail_dir :

View "email.mail_dir"
Column | Type | Modifiers | Storage | Description
----------+------+-----------+----------+-------------
home_dir | text | | extended |
View definition:
SELECT ((mailusers.domain_name || '/'::text) || mailusers.username) ||
'/'::text AS home_dir
FROM email.mailusers;

home_dir
------------------------------------
thetradinghall.com/arnaud.gaboury/
thetradinghall.com/admin/
thetradinghall.com/postmaster/

---------------------------------------------

What I am trying to do: I want the <home_dir> be returned for <username> u.

One of many difficulties with computers that they do what you say them to
do, not what you think or you think you are saying. :)
Lets see:

SELECT d.home_dir
FROM email.mail_dir d, email.mailusers u <- make a join between mail_dir
and mailusers = join every(!) record from the first table with every(!)
record from the second table
WHERE u.username='arnaud.gaboury'; <- but I need only those from the joined
records where the username is arnaud.gaboury

And there, you have it.

But it returns:
home_dir
------------------------------------
thetradinghall.com/arnaud.gaboury/
thetradinghall.com/admin/
thetradinghall.com/postmaster/
(3 rows)

You would have seen the problem, if you had used * instead d.homedir.
And there is no solution to your problem in the given circumstances.
You need the usename field in the view as well and then you can:

SELECT d.home_dir
FROM email.mail_dir d, email.mailusers u
WHERE u.username='arnaud.gaboury'
and u.usename=d.usename;

But it's completely unnecessary.

You can simply redefine the view.

SELECT *,((mailusers.domain_name || '/'::text) || mailusers.username) ||
'/'::text AS home_dir
FROM email.mailusers;

Notice the * after the SELECT statement.
So you have all the data plus the homedir.

You can leave out the whole view thing and incorporate the home_dir
expression right into your select.
Or you can write a function which makes this to you with the usename as
argument.

Regards,
Sándor

#4arnaud gaboury
arnaud.gaboury@gmail.com
In reply to: Sándor Daku (#3)
Re: Query from two tables return error

On Fri, Apr 1, 2016 at 3:33 PM, Sándor Daku <daku.sandor@gmail.com> wrote:

On 1 April 2016 at 11:33, arnaud gaboury <arnaud.gaboury@gmail.com> wrote:

I have one table email.mail.mailusers :

Table "email.mailusers"
Column | Type |
Modifiers | Storage
| Stats target | Description

-------------+--------------------------+---------------------------------------------+--------
--+--------------+-------------
username | text | not
null | extende
d | |
password | text | not
null | extende
d | |
domain_name | text | not null default '
thetradinghall.com'::text | extende
d | |
created | timestamp with time zone | not null default
now() | plain
| |
Indexes:
"mailusers_pkey" PRIMARY KEY, btree (username, domain_name)
Foreign-key constraints:
"mailusers_domain_fk" FOREIGN KEY (domain_name) REFERENCES
email.domainlist(domain_name)

username | password | domain_name | created

----------------+--------------------------------------------------------------+---------------
arnaud.gaboury | XXXXYYYYYY | thetradinghall.com | 2016-02-04
09:48:58.834774+01

admin |XXXYYYYYY | thetradinghall.com | 2016-03-29
09:58:14.599743+02

postmaster | XXXYYYYYY | thetradinghall.com | 2016-03-31
16:36:18.96176+02

----------------------------------------------------------

I have one view email.mail_dir :

View "email.mail_dir"
Column | Type | Modifiers | Storage | Description
----------+------+-----------+----------+-------------
home_dir | text | | extended |
View definition:
SELECT ((mailusers.domain_name || '/'::text) || mailusers.username) ||
'/'::text AS home_dir
FROM email.mailusers;

home_dir
------------------------------------
thetradinghall.com/arnaud.gaboury/
thetradinghall.com/admin/
thetradinghall.com/postmaster/

---------------------------------------------

What I am trying to do: I want the <home_dir> be returned for <username>
u.

One of many difficulties with computers that they do what you say them to
do, not what you think or you think you are saying. :)
Lets see:

SELECT d.home_dir
FROM email.mail_dir d, email.mailusers u <- make a join between mail_dir
and mailusers = join every(!) record from the first table with every(!)
record from the second table
WHERE u.username='arnaud.gaboury'; <- but I need only those from the
joined records where the username is arnaud.gaboury

And there, you have it.

You can simply redefine the view.

SELECT *,((mailusers.domain_name || '/'::text) || mailusers.username) ||
'/'::text AS home_dir
FROM email.mailusers;

Thank you so much. This way I get all needed info in one view.

Notice the * after the SELECT statement.
So you have all the data plus the homedir.

You can leave out the whole view thing and incorporate the home_dir
expression right into your select.
Or you can write a function which makes this to you with the usename as
argument.

Regards,
Sándor

--

google.com/+arnaudgabourygabx
<https://plus.google.com/_/notifications/emlink?emr=05814804238976922326&amp;emid=CKiv-v6PvboCFcfoQgod6msAAA&amp;path=%2F116159236040461325607%2Fop%2Fu&amp;dt=1383086841306&amp;ub=50&gt;

#5Adrian Klaver
adrian.klaver@aklaver.com
In reply to: arnaud gaboury (#4)
Re: Query from two tables return error

On 04/01/2016 06:52 AM, arnaud gaboury wrote:

On Fri, Apr 1, 2016 at 3:33 PM, Sándor Daku <daku.sandor@gmail.com

One of many difficulties with computers that they do what you say
them to do, not what you think or you think you are saying. :)
Lets see:
SELECT d.home_dir
FROM email.mail_dir d, email.mailusers u <- make a join between
mail_dir and mailusers = join every(!) record from the first table
with every(!) record from the second table
WHERE u.username='arnaud.gaboury'; <- but I need only those from the
joined records where the username is arnaud.gaboury

And there, you have it.

You can simply redefine the view.

SELECT *,((mailusers.domain_name || '/'::text) ||
mailusers.username) || '/'::text AS home_dir
FROM email.mailusers;

Thank you so much. This way I get all needed info in one view.

This might help understand what is going on:

http://www.postgresql.org/docs/9.5/interactive/tutorial-join.html

Notice the * after the SELECT statement.
So you have all the data plus the homedir.

You can leave out the whole view thing and incorporate the home_dir
expression right into your select.
Or you can write a function which makes this to you with the usename
as argument.

Regards,
Sándor

--

google.com/+arnaudgabourygabx
<https://plus.google.com/_/notifications/emlink?emr=05814804238976922326&amp;emid=CKiv-v6PvboCFcfoQgod6msAAA&amp;path=%2F116159236040461325607%2Fop%2Fu&amp;dt=1383086841306&amp;ub=50&gt;

--
Adrian Klaver
adrian.klaver@aklaver.com

--
Sent via pgsql-general mailing list (pgsql-general@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-general

#6arnaud gaboury
arnaud.gaboury@gmail.com
In reply to: Adrian Klaver (#5)
Re: Query from two tables return error

On Fri, Apr 1, 2016 at 4:04 PM, Adrian Klaver <adrian.klaver@aklaver.com>
wrote:

On 04/01/2016 06:52 AM, arnaud gaboury wrote:

On Fri, Apr 1, 2016 at 3:33 PM, Sándor Daku <daku.sandor@gmail.com

One of many difficulties with computers that they do what you say
them to do, not what you think or you think you are saying. :)
Lets see:
SELECT d.home_dir
FROM email.mail_dir d, email.mailusers u <- make a join between
mail_dir and mailusers = join every(!) record from the first table
with every(!) record from the second table
WHERE u.username='arnaud.gaboury'; <- but I need only those from the
joined records where the username is arnaud.gaboury

And there, you have it.

You can simply redefine the view.

SELECT *,((mailusers.domain_name || '/'::text) ||
mailusers.username) || '/'::text AS home_dir
FROM email.mailusers;

Thank you so much. This way I get all needed info in one view.

I even added a new column in my view to catch the email address:

SELECT *,((mailusers.domain_name || '/'::text) || mailusers.username) ||
'/'::text AS home_dir,
username||'@'||domain_name AS email_address
FROM email.mailusers;

Now, I am wondering if there is a best practice between :
- one large and complete table
- a lighter table with some views

This might help understand what is going on:

http://www.postgresql.org/docs/9.5/interactive/tutorial-join.html

Thank you for the link.

Notice the * after the SELECT statement.
So you have all the data plus the homedir.

You can leave out the whole view thing and incorporate the home_dir
expression right into your select.
Or you can write a function which makes this to you with the usename
as argument.

Regards,
Sándor

--

google.com/+arnaudgabourygabx
<
https://plus.google.com/_/notifications/emlink?emr=05814804238976922326&amp;emid=CKiv-v6PvboCFcfoQgod6msAAA&amp;path=%2F116159236040461325607%2Fop%2Fu&amp;dt=1383086841306&amp;ub=50

--
Adrian Klaver
adrian.klaver@aklaver.com

--

google.com/+arnaudgabourygabx
<https://plus.google.com/_/notifications/emlink?emr=05814804238976922326&amp;emid=CKiv-v6PvboCFcfoQgod6msAAA&amp;path=%2F116159236040461325607%2Fop%2Fu&amp;dt=1383086841306&amp;ub=50&gt;