/ 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
Tælle unikke id's i 2 kolonner
Fra : Allan E


Dato : 23-07-03 22:07

Hej

Jeg har en tabel med 2 kolonner som indeholder fremmednøgler/id's til en
bestemt anden tabel. Dvs at de to kolonner kan indeholde det samme id op til
flere gange.

Nu er jeg imidlertid interesseret i at finde frem til hvor mange unikke id's
jeg har i disse to kolonner.
Det er intet problem at finde frem til antallet at unikke id i den første
kolonne:
SELECT COUNT(DISTINCT 1_id) FROM tabel
men hvordan finder jeg antallet af id's i kolonnen 2_id som ikke allerede er
talt med i 1_id?

Jeg har forsøgt med noget 'NOT IN' og en subselect men har ikke kunne få det
til at fungere i mySQL.
Er der noget der har et forslag på løsningen af mit problem?

Mvh Allan E



 
 
Kim Hansen (23-07-2003)
Kommentar
Fra : Kim Hansen


Dato : 23-07-03 22:55

"Allan E" <ege@per_fjern_son.dk> writes:

> Hej
>
> Jeg har en tabel med 2 kolonner som indeholder fremmednøgler/id's til en
> bestemt anden tabel. Dvs at de to kolonner kan indeholde det samme id op til
> flere gange.
>
> Nu er jeg imidlertid interesseret i at finde frem til hvor mange unikke id's
> jeg har i disse to kolonner.
> Det er intet problem at finde frem til antallet at unikke id i den første
> kolonne:
> SELECT COUNT(DISTINCT 1_id) FROM tabel
> men hvordan finder jeg antallet af id's i kolonnen 2_id som ikke allerede er
> talt med i 1_id?
>
> Jeg har forsøgt med noget 'NOT IN' og en subselect men har ikke kunne få det
> til at fungere i mySQL.
> Er der noget der har et forslag på løsningen af mit problem?

Hvis det er fordi du har en version af mysql som ikke har subselects
kan du i stedet løse problemet med en left join (dette er ikke
testet):

SELECT t1.2_id FROM table t1 LEFT JOIN tabel t2 ON t1.2_id==t2.1_id
WHERE t2.1_id IS NOT NULL

--
Kim Hansen | |\ _,,,---,,_ | Det er ikke
Dalslandsgade 8, A708 | /,`.-´` -. ;:-. | Jeopardy.
2300 København S | |,4- ) )-,_. ,\ ( `'-' | Svar _efter_
Tlf: 32 88 60 86 | '---''(_/--' `-'\_) | spørgsmålet.

Allan E (23-07-2003)
Kommentar
Fra : Allan E


Dato : 23-07-03 23:11

Kim Hansen wrote:
> Hvis det er fordi du har en version af mysql som ikke har subselects
> kan du i stedet løse problemet med en left join (dette er ikke
> testet):
>
> SELECT t1.2_id FROM table t1 LEFT JOIN tabel t2 ON t1.2_id==t2.1_id
> WHERE t2.1_id IS NOT NULL

Tak for forslaget. Men det løser ikke problemet. Jeg får stadig ikke
sorteret de id's fra som allerede findes i kolonne 1.

Btw. Jeg kører mySQL version 4.0.12. Burde den ikke understøtte subselects??

Allan E



Kim Hansen (23-07-2003)
Kommentar
Fra : Kim Hansen


Dato : 23-07-03 23:33

"Allan E" <ege@per_fjern_son.dk> writes:

> Kim Hansen wrote:
> > Hvis det er fordi du har en version af mysql som ikke har subselects
> > kan du i stedet løse problemet med en left join (dette er ikke
> > testet):
> >
> > SELECT t1.2_id FROM table t1 LEFT JOIN tabel t2 ON t1.2_id==t2.1_id
> > WHERE t2.1_id IS NOT NULL
>
> Tak for forslaget. Men det løser ikke problemet. Jeg får stadig ikke
> sorteret de id's fra som allerede findes i kolonne 1.

Det har du ret i, der skulle have stået IS NULL i stedet for
IS NOT NULL.

Forslaget med UNION er dog nemmere:
SELECT COUNT(*) FROM (
SELECT 1_id FROM table
UNION
SELECT 2_id FROM table
)

--
Kim Hansen | |\ _,,,---,,_ | Det er ikke
Dalslandsgade 8, A708 | /,`.-´` -. ;:-. | Jeopardy.
2300 København S | |,4- ) )-,_. ,\ ( `'-' | Svar _efter_
Tlf: 32 88 60 86 | '---''(_/--' `-'\_) | spørgsmålet.

Allan E (24-07-2003)
Kommentar
Fra : Allan E


Dato : 24-07-03 09:08

Kim Hansen wrote:
> "Allan E" <ege@per_fjern_son.dk> writes:
>
>>> SELECT t1.2_id FROM table t1 LEFT JOIN tabel t2 ON
>>> t1.2_id==t2.1_id WHERE t2.1_id IS NOT NULL
>>
>> Tak for forslaget. Men det løser ikke problemet. Jeg får stadig ikke
>> sorteret de id's fra som allerede findes i kolonne 1.
>
> Det har du ret i, der skulle have stået IS NULL i stedet for
> IS NOT NULL.
Ahh, ja det ser jo bedre jo
Takker.

Allan E



Troels Arvin (23-07-2003)
Kommentar
Fra : Troels Arvin


Dato : 23-07-03 23:10

On Wed, 23 Jul 2003 23:07:19 +0200, Allan E wrote:

> har ikke kunne få det til at fungere i mySQL.

Der er så mange ting, man ikke kan i MySQL. Er MySQL 4 acceptabel? - Den
kender trods alt til UNION, som du nok skal bruge.

--
Greetings from Troels Arvin, Copenhagen, Denmark


Allan E (23-07-2003)
Kommentar
Fra : Allan E


Dato : 23-07-03 23:14

Troels Arvin wrote:
> On Wed, 23 Jul 2003 23:07:19 +0200, Allan E wrote:
>
>> har ikke kunne få det til at fungere i mySQL.
>
> Der er så mange ting, man ikke kan i MySQL.

Ja desværre

>Er MySQL 4 acceptabel? -

Ja jeg kører version 4.0.12

> Den kender trods alt til UNION, som du nok skal bruge.

Okay??



Troels Arvin (23-07-2003)
Kommentar
Fra : Troels Arvin


Dato : 23-07-03 23:39

On Thu, 24 Jul 2003 00:13:38 +0200, Allan E wrote:

>>Er MySQL 4 acceptabel? -
>
> Ja jeg kører version 4.0.12

mysql> select * from testtab;
+------+------+
| col1 | col2 |
+------+------+
| aaa | bbb |
| aaa | ccc |
| ddd | fff |
| ccc | fff |
| aaa | fff |
| fff | fff |
| mmm | ggg |
| vvv | nnn |
+------+------+
8 rows in set (0.00 sec)

mysql> (select col1 from testtab) union (select col2 from testtab);
+------+
| col1 |
+------+
| aaa |
| ddd |
| ccc |
| fff |
| mmm |
| vvv |
| bbb |
| ggg |
| nnn |
+------+
9 rows in set (0.00 sec)

Hvis du også vil have _talt_ resultatet af din union-operation, så er gode
dyr rådne, for MySQL 4.0 understøtter vist fortsat ikke subselects såsom

select count(*) from (
(select col1 from testtab)
union
(select col2 from testtab)
) as united;

--
Greetings from Troels Arvin, Copenhagen, Denmark


Peter Brodersen (24-07-2003)
Kommentar
Fra : Peter Brodersen


Dato : 24-07-03 01:21

On Thu, 24 Jul 2003 00:38:55 +0200, Troels Arvin <troels@arvin.dk>
wrote:

>Hvis du også vil have _talt_ resultatet af din union-operation, så er gode
>dyr rådne, for MySQL 4.0 understøtter vist fortsat ikke subselects såsom
>
>select count(*) from (
> (select col1 from testtab)
> union
> (select col2 from testtab)
>) as united;

Hm, sidstnævnte kan jeg ikke engang få til at virke under MySQL 4.1
(4.1.0-alpha-max-nt):

-- Virker fint:
SELECT COUNT(*) FROM (
SELECT foo FROM bar
) AS baz;

-- Giver forståelig fejl:
SELECT COUNT(*) FROM (
SELECT foo FROM bar
);
ERROR 1246: Every derived table must have it's own alias

-- Giver uforståelig fejl:
SELECT COUNT(*) FROM (
(SELECT foo FROM bar)
UNION
(SELECT foo2 FROM bar2)
) AS baz;
ERROR 1246: Every derived table must have it's own alias

Som sådan er der jo kun én derived table på det tidspunkt, union'en er
færdig. Det er jo kun én tabel, der returneres, så den fejl undrer mig
lidt.

--
- Peter Brodersen

Allan E (24-07-2003)
Kommentar
Fra : Allan E


Dato : 24-07-03 09:13

Troels Arvin wrote:
> On Thu, 24 Jul 2003 00:13:38 +0200, Allan E wrote:
> Hvis du også vil have _talt_ resultatet af din union-operation, så er
> gode dyr rådne, for MySQL 4.0 understøtter vist fortsat ikke
> subselects såsom
>
> select count(*) from (
> (select col1 from testtab)
> union
> (select col2 from testtab)
> ) as united;

Skod ! For det var præcis det jeg ville.
Men nu har jeg fået det til at virke, med en kombination af Kim Hansens join
forslag og en UNION med en SELECT der henter de unikke rækker i første
kolonne.
Så for jeg godt nok resultatet tilbage i to rækker, men det må jeg så leve
med. Så må jeg jo bare lægge dem sammen manuelt

Tak for hjælpen.

Allan E



Troels Arvin (24-07-2003)
Kommentar
Fra : Troels Arvin


Dato : 24-07-03 12:46

On Thu, 24 Jul 2003 10:12:34 +0200, Allan E wrote:

> Men nu har jeg fået det til at virke

Må vi se, hvad du endte med?

--
Greetings from Troels Arvin, Copenhagen, Denmark


Allan E (24-07-2003)
Kommentar
Fra : Allan E


Dato : 24-07-03 20:28

Troels Arvin wrote:
> Må vi se, hvad du endte med?

Gerne

(
SELECT COUNT(DISTINCT t1.2_id) AS s
FROM tabel t1
LEFT JOIN tabel t2 ON t1.2_id = t2.1_id
WHERE t2.1_id IS NULL
)
UNION
(
SELECT COUNT(DISTINCT 1_id) AS s
FROM tabel
)
Det giver dog som sagt to rækker, en for hver select, som så lige skal
lægges sammen bagefter.

Allan E



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

Månedens bedste
Årets bedste
Sidste års bedste