Обсуждение: select and join
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"
> 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
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
~~~~~~~~~~~~~~~~~~~~