Thread: select and join

select and join

From
ZioBudda
Date:
Hi, I have this 3 table:
esame=> \d prestito

Table    = prestito
+----------------------------------+----------------------------------+-------+
|              Field               |              Type                | Length|
+----------------------------------+----------------------------------+-------+
| id_libro                         | varchar() not null               |    10 |
| id_utente                        | int4 not null                    |     4 |
| data_prestito                    | date                             |     4 |
| data_restituzione                | date                             |     4 |
| n_gg_prestito                    | int4 not null                    |     4 |
| notifica1                        | date                             |     4 |
| notifica2                        | date                             |     4 |
| notifica3                        | date                             |     4 |
+----------------------------------+----------------------------------+-------+

Table    = libro
+----------------------------------+----------------------------------+-------+
|              Field               |              Type                | Length|
+----------------------------------+----------------------------------+-------+
| titolo                           | varchar() not null               |    80 |
| id_libro                         | varchar() not null               |    10 |
| id_utente                        | int4                             |     4 |
| collocazione                     | varchar() not null               |    10 |
| casa_edit                        | varchar()                        |    20 |
| data_publ                        | date                             |     4 |
| tipo                             | int4                             |     4 |
| difetto                          | varchar()                        |    40 |
+----------------------------------+----------------------------------+-------+

Table    = utente
+----------------------------------+----------------------------------+-------+
|              Field               |              Type                | Length|
+----------------------------------+----------------------------------+-------+
| cognome                          | varchar() not null               |    20 |
| nome                             | varchar()                        |    20 |
| id_utente                        | int4 not null default nextval (  |     4 |
| indirizzo                        | varchar()                        |    80 |
| telefono                         | varchar() not null               |    14 |
| tipo_utente                      | int4                             |     4 |
| info_utente                      | varchar() not null               |    40 |
| libri_presi                      | int4                             |     4 |
| notifica1                        | date                             |     4 |
| notifica2                        | date                             |     4 |
| notifica3                        | date                             |     4 |
| password                         | varchar()                        |    10 |
+----------------------------------+----------------------------------+-------+

Now, when I make this select:
esame=> select prestito.id_utente, libro.tipo, count(*) from prestito, libro where libro.id_libro = prestito.id_libro
groupby id_utente, tipo\g 

the output is (it is correct, too):
id_utente|tipo|count
---------+----+-----
        9|   1|    1
       19|   1|    2
       19|   2|    1
(3 rows)

My question is: there is a way to join the table "utente" so to make a "select" that return me the column
"utente.cognome",too?  

i have make this try:
esame=> select utente.cognome, prestito.id_utente, libro.tipo, count(*) from prestito, libro where libro.id_libro =
prestito.id_libroand utente.id_utente = prestito.id_utente group by id_utente, tipo\g 


My question is: there is a way to join the table "utente" so to make a "select" that return me the column
"utente.cognome",too?  

i have make this try:
esame=> select utente.cognome, prestito.id_utente, libro.tipo, count(*) from prestito, libro where libro.id_libro =
prestito.id_libroand utente.id_utente = prestito.id_utente group by id_utente, tipo\g 

but the output is :
ERROR:  parser: illegal use of aggregates or non-group column in target list

Or is beeter get the first select (the select without the "utente.cognome") and make a
select foreach "id_utente" so that I get "utente.cognome".

thanks in advance.

PS: I have buy this book: "The pratical sql handbook (3th edition - 1996)". How is it ?
good ? bleah?



"Il divertimento e' giusto se la scimmia ci prende gusto"
--
Pluto Linux Press: http://ziobudda.enter.it/PLP
--
Morelli 'ZioBudda' Davide Michel - Member of Pluto Linux User Group
michel@enter.it - http://ziobudda.enter.it/
Linux Problem? Ask to linux@media.dsi.unimi.it
"/dev/ziobudda: access to /var/tmp/beer denied, use /var/adm/pineapple"


RE: [GENERAL] select and join

From
"Taral"
Date:
> i have make this try:
> esame=> select utente.cognome, prestito.id_utente, libro.tipo,
> count(*) from prestito, libro where libro.id_libro =
> prestito.id_libro and utente.id_utente = prestito.id_utente group
> by id_utente, tipo\g
>
> but the output is :
> ERROR:  parser: illegal use of aggregates or non-group column in
> target list

I keep seeing this... When doing something like this, you must have ALL
non-aggregate columns in the GROUP BY.

So: (note you also forgot to update the FROM)

SELECT utente.cognome, prestito.id_utente, libro.tipo, count(*) FROM
prestito, libro, utente WHERE libro.id_libro = prestito.id_libro AND
utente.id_utente = prestito.id_utente GROUP BY cognome, id_utente, tipo;

Taral


Re: [GENERAL] select and join

From
Ulf Mehlig
Date:
Morelli 'ZioBudda' Davide Michel wrote:

> My question is: there is a way to join the table "utente" so to make a
> "select" that return me the column "utente.cognome",too ?
>
> i have make this try:
>
> esame=> select utente.cognome,
>                prestito.id_utente,
>                libro.tipo,
>                count(*)
>         from  prestito, libro
>         where libro.id_libro = prestito.id_libro and
>               utente.id_utente = prestito.id_utente
>         group by id_utente,
>                  tipo\g

(re-arranged)

Generally, the column functions/aggregates like count() can be applied
only if all non-aggregates/functions appear in the "group by"-section;
you joined the three tables correctly (however, you forgot to put the
third table name into the "from"-section!), but you have to tell the
database engine to determine the count grouped by "utente.cognome",
too. Try:

       select utente.cognome,
              prestito.id_utente,
              libro.tipo,
              count(*)
       from utente, prestito, libro
       where libro.id_libro = prestito.id_libro and
             utente.id_utente = prestito.id_utente
       group by utente.cognome,
                prestito.id_utente,
                libro.tipo

The result should be what you desired, because the relation
"utente.cognome"->"prestito.id_utente" is one-to-one. And you should
specify the table name for "id_utente" in the "group by"-section, too,
because this column name is not unique. Anyway, I did not test
anything, and maybe I overlooked something important ... I hope it
helps ...

Yours, Ulf

--
======================================================================
 %%%%%            Ulf Mehlig              <ulf.mehlig@uni-bremen.de>
   %%%%!%%%       Projekt "MADAM"         <umehlig@uni-bremen.de>
%%%% %!% %%%%     ----------------------------------------------------
 ---| %%%         MADAM:  MAngrove    |  Center for Tropical Marine
    ||--%!%              Dynamics     |  Biology
    ||                  And           |  Fahrenheitstrasse 1
 _ /||\_/\_            Management     |
/  /    \  \ ~~~~~~~~~~~~~~~~~        |  28359 Bremen/Germany
  ~~~~~~~~~~~~~~~~~~~~