/ Forside / Teknologi / Udvikling / SQL / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
SQL
#NavnPoint
pmbruun 1704
niller 962
fehaar 730
Interkril.. 701
ellebye 510
pawel 510
rpje 405
pete 350
gibson 320
10  smorch 260
En lille udfordring
Fra : Jacob Atzen


Dato : 18-02-03 15:39

Hej NG,

Jeg sidder og kæmper med at lave en lille forespørgsel.

Jeg har en tabel med id, navn og adresse.

Der er nogen navne der forekommer flere gange i tabellen, men muligvis
med forskellig adresse. Jeg vil nu gerne have alle de adresser, der er
tilknyttet navne, der forekommer mere end 1 gang.

Jeg kan finde de relevante navne ved:
SELECT count(*) as c, navn FROM table GROUP BY navn HAVING c > 1;

Men jeg kan ikke finde ud af, hvordan jeg får den til at vise de
tilhørende adresser. Håber nogen kan hjælpe.

Det skal nævnes, at jeg bruger MySQL 3.23.x så jeg kan ikke bruge
subselects :-/

--
Med venlig hilsen

Jacob Atzen

 
 
Kim Schulz (18-02-2003)
Kommentar
Fra : Kim Schulz


Dato : 18-02-03 15:56

On 18 Feb 2003 15:39:09 +0100
Jacob Atzen <jaa@interflow.dk> wrote:
> Hej NG,
>
> Jeg sidder og kæmper med at lave en lille forespørgsel.
>
> Jeg har en tabel med id, navn og adresse.
>
> Der er nogen navne der forekommer flere gange i tabellen, men muligvis
> med forskellig adresse. Jeg vil nu gerne have alle de adresser, der er
> tilknyttet navne, der forekommer mere end 1 gang.
>
> Jeg kan finde de relevante navne ved:
> SELECT count(*) as c, navn FROM table GROUP BY navn HAVING c > 1;
>
> Men jeg kan ikke finde ud af, hvordan jeg får den til at vise de
> tilhørende adresser. Håber nogen kan hjælpe.
>
> Det skal nævnes, at jeg bruger MySQL 3.23.x så jeg kan ikke bruge
> subselects :-/


hvad med noget ala?

select adresse, navn from table group by navn having count(*) > 1;
eller måske med WHERE i stedet for HAVING

Jacob Atzen (18-02-2003)
Kommentar
Fra : Jacob Atzen


Dato : 18-02-03 16:28

Kim Schulz <kim@schulz.dk> writes:

> hvad med noget ala?
>
> select adresse, navn from table group by navn having count(*) > 1;
> eller måske med WHERE i stedet for HAVING

Den går ikke - jeg får kun en adresse ud til hvert navn. Jeg vil gerne
have alle adresser tilknyttet navnet.

--
Med venlig hilsen

Jacob Atzen

Kim Schulz (18-02-2003)
Kommentar
Fra : Kim Schulz


Dato : 18-02-03 20:53

On 18 Feb 2003 16:27:37 +0100
Jacob Atzen <jaa@interflow.dk> wrote:
> Kim Schulz <kim@schulz.dk> writes:
>
> > hvad med noget ala?
> >
> > select adresse, navn from table group by navn having count(*) > 1;
> > eller måske med WHERE i stedet for HAVING
>
> Den går ikke - jeg får kun en adresse ud til hvert navn. Jeg vil gerne
> have alle adresser tilknyttet navnet.

prøv at fjerne group by navn så.

Carsten Schack-Eriks~ (18-02-2003)
Kommentar
Fra : Carsten Schack-Eriks~


Dato : 18-02-03 23:47

> Hej NG,
>
> Jeg sidder og kæmper med at lave en lille forespørgsel.
>
> Jeg har en tabel med id, navn og adresse.
>
> Der er nogen navne der forekommer flere gange i tabellen, men muligvis
> med forskellig adresse. Jeg vil nu gerne have alle de adresser, der er
> tilknyttet navne, der forekommer mere end 1 gang.
>
> Jeg kan finde de relevante navne ved:
> SELECT count(*) as c, navn FROM table GROUP BY navn HAVING c > 1;
>

select navn,adresse from table where navn in (select navn from table group
by navn having count(*)>1)

/Carsten



Kim Schulz (19-02-2003)
Kommentar
Fra : Kim Schulz


Dato : 19-02-03 00:28

On Tue, 18 Feb 2003 23:46:47 +0100
"Carsten Schack-Eriksen" <carsten@schack-eriksen.dk> wrote:
> > Hej NG,
> >
> > Jeg sidder og kæmper med at lave en lille forespørgsel.
> >
> > Jeg har en tabel med id, navn og adresse.
> >
> > Der er nogen navne der forekommer flere gange i tabellen, men
> > muligvis med forskellig adresse. Jeg vil nu gerne have alle de
> > adresser, der er tilknyttet navne, der forekommer mere end 1 gang.
> >
> > Jeg kan finde de relevante navne ved:
> > SELECT count(*) as c, navn FROM table GROUP BY navn HAVING c > 1;
> >
>
> select navn,adresse from table where navn in (select navn from table
> group by navn having count(*)>1)

ingen subselects

Kristian Damm Jensen (19-02-2003)
Kommentar
Fra : Kristian Damm Jensen


Dato : 19-02-03 10:37

Kim Schulz wrote:
>
> On 18 Feb 2003 16:27:37 +0100
> Jacob Atzen <jaa@interflow.dk> wrote:
> > Kim Schulz <kim@schulz.dk> writes:
> >
> > > hvad med noget ala?
> > >
> > > select adresse, navn from table group by navn having count(*) > 1;
> > > eller måske med WHERE i stedet for HAVING
> >
> > Den går ikke - jeg får kun en adresse ud til hvert navn. Jeg vil gerne
> > have alle adresser tilknyttet navnet.
>
> prøv at fjerne group by navn så.

Uden group by vil count tælle det samlede antal rækker i tabellen.


--
Kristian Damm Jensen | Feed the hungry at www.thehungersite.com
kristian-damm.jensen@cgey.com | Two wrongs doesn't make a right,
ICQ# 146728724 | but three lefts do.



Kristian Damm Jensen (19-02-2003)
Kommentar
Fra : Kristian Damm Jensen


Dato : 19-02-03 10:40

Jacob Atzen wrote:
>
> Hej NG,
>
> Jeg sidder og kæmper med at lave en lille forespørgsel.
>
> Jeg har en tabel med id, navn og adresse.
>
> Der er nogen navne der forekommer flere gange i tabellen, men muligvis
> med forskellig adresse. Jeg vil nu gerne have alle de adresser, der er
> tilknyttet navne, der forekommer mere end 1 gang.
>
> Jeg kan finde de relevante navne ved:
> SELECT count(*) as c, navn FROM table GROUP BY navn HAVING c > 1;
>
> Men jeg kan ikke finde ud af, hvordan jeg får den til at vise de
> tilhørende adresser. Håber nogen kan hjælpe.
>
> Det skal nævnes, at jeg bruger MySQL 3.23.x så jeg kan ikke bruge
> subselects :-/

Der er mange løsninger på problemet - og alle dem jeg kan komme i tanker
om, kræver at man har subselect under en eller anden form; i
where-klausulen, from klausulen eller select-klausulen.

Uden subselect er det eneste fornuftige alternativ at hælde skidtet ned
i en temporær tabel først, og så joine med den bagefter.

--
Kristian Damm Jensen | Feed the hungry at www.thehungersite.com
kristian-damm.jensen@cgey.com | Two wrongs doesn't make a right,
ICQ# 146728724 | but three lefts do.


Nis Jorgensen (19-02-2003)
Kommentar
Fra : Nis Jorgensen


Dato : 19-02-03 11:20

On 18 Feb 2003 15:39:09 +0100, Jacob Atzen <jaa@interflow.dk> wrote:

>Hej NG,
>
>Jeg sidder og kæmper med at lave en lille forespørgsel.
>
>Jeg har en tabel med id, navn og adresse.
>
>Der er nogen navne der forekommer flere gange i tabellen, men muligvis
>med forskellig adresse. Jeg vil nu gerne have alle de adresser, der er
>tilknyttet navne, der forekommer mere end 1 gang.
>
>Jeg kan finde de relevante navne ved:
>SELECT count(*) as c, navn FROM table GROUP BY navn HAVING c > 1;
>
>Men jeg kan ikke finde ud af, hvordan jeg får den til at vise de
>tilhørende adresser. Håber nogen kan hjælpe.
>
>Det skal nævnes, at jeg bruger MySQL 3.23.x så jeg kan ikke bruge
>subselects :-/

SÃ¥ har du jo selv bedt om udfordringen ...

SELECT t1.navn, t1.adresse
FROM table as t1, table as t2
WHERE t1.navn = t2.navn
GROUP BY t1.navn, t1.adresse
HAVING count(*) > 1

--
Nis Jørgensen
Amsterdam

Please include only relevant quotes, and reply below the quoted text. Thanks

Kristian Damm Jensen (19-02-2003)
Kommentar
Fra : Kristian Damm Jensen


Dato : 19-02-03 12:36

Nis Jorgensen wrote:
>
<snip>

> SÃ¥ har du jo selv bedt om udfordringen ...

Og så i den grad...

> SELECT t1.navn, t1.adresse
> FROM table as t1, table as t2
> WHERE t1.navn = t2.navn
> GROUP BY t1.navn, t1.adresse
> HAVING count(*) > 1

Men det nytter jo ikke noget, da det netop er pointen at adresserne er
forskellige.


--
Kristian Damm Jensen | Feed the hungry at www.thehungersite.com
kristian-damm.jensen@cgey.com | Two wrongs doesn't make a right,
ICQ# 146728724 | but three lefts do.



Nis Jorgensen (20-02-2003)
Kommentar
Fra : Nis Jorgensen


Dato : 20-02-03 12:08

On Wed, 19 Feb 2003 12:36:23 +0100, Kristian Damm Jensen
<kristian-damm.jensenRE@MOVEcgey.com> wrote:

>Nis Jorgensen wrote:
>>
><snip>
>
>> SÃ¥ har du jo selv bedt om udfordringen ...
>
>Og så i den grad...
>
>> SELECT t1.navn, t1.adresse
>> FROM table as t1, table as t2
>> WHERE t1.navn = t2.navn
>> GROUP BY t1.navn, t1.adresse
>> HAVING count(*) > 1
>
>Men det nytter jo ikke noget, da det netop er pointen at adresserne er
>forskellige.

Ja ... hvis vi har folgende i vores tabel

Navn Adresse
---- -------
Nis Vej 1
Nis Gade 32
Jan Anden vej


bliver resultatet af FROM + WHERE:

t1.navn t1.adresse t2.navn t2.adresse
------- ---------- ------- ----------
Nis Vej 1 Nis Vej 1
Nis Vej 1 Nis Gade32
Nis Gade 32 Nis Vej 1
Nis Gade 32 Nis Gade32
Jan Anden vej Jan Anden vej

Herefter grupperes og tælles
t1.navn t1.adresse Count(*)
------- ---------- --------
Nis Vej 1 2
Nis Gade 32 2
Jan Anden vej 1

og filtreres paa Count(*) >1

t1.navn t1.adresse
------- ----------
Nis Vej 1
Nis Gade 32

--
Nis Jørgensen
Amsterdam

Please include only relevant quotes, and reply below the quoted text. Thanks

Kristian Damm Jensen (21-02-2003)
Kommentar
Fra : Kristian Damm Jensen


Dato : 21-02-03 09:13

Nis Jorgensen wrote:
>
> On Wed, 19 Feb 2003 12:36:23 +0100, Kristian Damm Jensen
> <kristian-damm.jensenRE@MOVEcgey.com> wrote:
>
<snip>

> >Men det nytter jo ikke noget, da det netop er pointen at adresserne er
> >forskellige.
>
> Ja ... hvis vi har folgende i vores tabel
>
> Navn Adresse
> ---- -------
> Nis Vej 1
> Nis Gade 32
> Jan Anden vej
>
<snip>

> t1.navn t1.adresse
> ------- ----------
> Nis Vej 1
> Nis Gade 32

Ja. Undskyld, jeg havde ikke bemærket dit self-join.



--
Kristian Damm Jensen | Feed the hungry at www.thehungersite.com
kristian-damm.jensen@cgey.com | Two wrongs doesn't make a right,
ICQ# 146728724 | but three lefts do.



Jacob Atzen (20-02-2003)
Kommentar
Fra : Jacob Atzen


Dato : 20-02-03 12:44

Nis Jorgensen <nis@dkik.dk> writes:

> Så har du jo selv bedt om udfordringen ...

Nej, jeg stillede den for nu at være pedantisk

> SELECT t1.navn, t1.adresse
> FROM table as t1, table as t2
> WHERE t1.navn = t2.navn
> GROUP BY t1.navn, t1.adresse
> HAVING count(*) > 1

Tak for svaret. Det var det jeg manglede.

--
Med venlig hilsen

Jacob Atzen

Nikolaj Hansen (19-02-2003)
Kommentar
Fra : Nikolaj Hansen


Dato : 19-02-03 17:23

Dit problem kan løses ved at lave lidt om i din datamodel.

Hvis du har dine Person relaterede data i en tabel, og dine Adresse data
i en anden kan du lave en N:M relation i mellem de to tabeller. Det vil
betyde at:

- Flere personer kan bo på den samme adresse.
- En person kan bo på flere adresser.

Det er i øvrigt sådan at KOB databasen (Firmaer i DK) og CPR databasen
(Personer i DK) virker

Men dem skal man betale for. Oracle notation:

Select *
from
Person a, Address b, Person_address c
where
   a.Perid = c.Perid and
   c.addid = b.addid (+);

Altså en outer join på address tabellen for at få en forekomst af de
andre data, hver gang der er en række i address tabellen.



Søg
Reklame
Statistik
Spørgsmål : 177559
Tips : 31968
Nyheder : 719565
Indlæg : 6408938
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste