Avatar billede afischer Nybegynder
28. maj 2010 - 10:32 Der er 14 kommentarer

Udtræk i én query!?

Jeg har én tabel der er bygget op som følger:

+------------+------------+------------+
#
| Tidspunkt  |  IDFra    |    IDTil  |
#
+------------+------------+------------+
#
| 1273345514 |    1      |    2      |
#
+------------+------------+------------+
#
| 1273345514 |    2      |    1      |
#
+------------+------------+------------+
#
| 1273345514 |    3      |    1      |
#
+------------+------------+------------+
#
| 1273345514 |    1      |    3      |
#
+------------+------------+------------+

Kan det lade sig gøre via én query til databasen, at finde alle tilfælde hvor der er både IDFra og IDTil med samme ID.

Altså eksempelvis hvis jeg gerne vil checke om det forefindes med et ID som er 1, får jeg både IDTil returneret som i dette tilfælde vil være 2 og 3. Forespørger jeg med et ID som er 2, får jeg kun 1 returneret. Forespørger jeg med ID som er 4, får jeg intet returneret.

Det har været lidt svært for mig at forklare, præcis hvad jeg mener. Men håber I forstår pointen - ellers vil jeg gerne prøve at forklare mig anderledes!

På forhånd tak for hjælpen :)
Avatar billede j4k0b Nybegynder
28. maj 2010 - 10:49 #1
Jeg forstod ikke helt hvad du mener, men...


Kan det lade sig gøre via én query til databasen, at finde alle tilfælde hvor der er både IDFra og IDTil med samme ID.

Vil du hente alle rækker hvor IDFra er det samme som IDTil?

SELECT * FROM tabel WHERE IDFra = IDTil;

Ellers er jeg bange for at du må forklare hvad du vil opnå?
Avatar billede afischer Nybegynder
28. maj 2010 - 10:53 #2
Hej!

Det er ikke det, som jeg vil opnå.
Jeg vil gerne have et udtræk af ID's hvor det eksisterer både som IDTil og IDFra.

Dvs. i forhold til ovenstående eksempel vil den returnere ID: 1, 2 og 3, hvis jeg forespørger på dem, men null, hvis jeg forespørger på ID 4.

Gav det mere mening? :)
Avatar billede j4k0b Nybegynder
28. maj 2010 - 10:54 #3
SELECT * FROM tabel WHERE IDFra=1 OR IDTil=1;

?
Avatar billede afischer Nybegynder
28. maj 2010 - 10:58 #4
Ja, men så får jeg to rows for hvert ID, som jeg skal behandle med PHP bagefter. Det kan jeg også sagtens - det gør jeg i dag :)

Jeg ville dog gerne klare det i min query, hvis det er muligt!
Avatar billede j4k0b Nybegynder
28. maj 2010 - 11:09 #5
Jeg forstår ikke... Med ovenstående får du kun ét resultat for hver række. Du vil aldrig få samme række ud to gange?
Avatar billede showsource Seniormester
28. maj 2010 - 11:10 #6
Ved ikke hvor godt det er, men du kan vist:

SELECT * FROM tabel WHERE IDFra IN (SELECT DISTINCT(IDTil) FROM tabel)
Avatar billede jesperhgh Nybegynder
29. maj 2010 - 11:35 #7
Dette virker, som efterspurgt:

mysql> select * from test;
+------+------+
| id1  | id2  |
+------+------+
|    1 |    2 |
|    2 |    1 |
|    3 |    1 |
|    1 |    3 |
|    4 |    1 |
|    4 |    2 |
+------+------+
6 rows in set (0.00 sec)

mysql> select distinct id1 from test where id1=1 and id1 in (select distinct id2 from test where id2=1);
+------+
| id1  |
+------+
|    1 |
+------+
1 row in set (0.00 sec)

mysql> select distinct id1 from test where id1=2 and id1 in (select distinct id2 from test where id2=2);
+------+
| id1  |
+------+
|    2 |
+------+
1 row in set (0.00 sec)

mysql> select distinct id1 from test where id1=4 and id1 in (select distinct id2 from test where id2=4);
Empty set (0.00 sec)

mysql>
Avatar billede jesperhgh Nybegynder
29. maj 2010 - 12:17 #8
..eller på php'sk:

<?php

function isDoubleId($id) {
    $result = false;
    mysql_connect();
    $sql = "select distinct id1 from test where id1={$id}"
        . " and id1 in (select distinct id2 from test where id2={$id})";
    $ds = mysql_query($sql);
    if(mysql_num_rows($ds))
        $result = true;
    mysql_close();
    return $result;
}

if(isDoubleId(4))
    echo 'ja';
else
    echo 'nej';

?>
Avatar billede afischer Nybegynder
29. maj 2010 - 16:37 #9
Hej Jesper!

Tak for dit svar. Det virker som noget der ligner den rigtige løsning. Omend jeg dog ikke helt kan få det til at fungere.

Jeg bruger følgende query på min database (modificeret version af din):

SELECT DISTINCT ID1 FROM matchprofile WHERE ID2 = ? AND ID2 IN (SELECT DISTINCT ID1 FROM matchprofile WHERE ID1 = ?)

Men jeg får alligevel et udtræk, hvor den det ID som jeg forespørg på kun eksisterer i ID1 kolonnen..
Er du sikker på, at din løsning er helt korrekt - eller er det bare mig som ikke implementerer den ordenligt? :=)

På forhånd tak for hjælpen!
Avatar billede jesperhgh Nybegynder
29. maj 2010 - 17:52 #10
Mit svar gik ud på at kunne fortælle om en given ID findes som både en ID1 og som en ID2. Altså et spørgsmål, som der kan svares Ja eller Nej på.
Hvis du får en record med et felt (ID1) så er svaret Ja. Hvis du får et tomt dataset, så er svaret Nej.

Hvis du kigger lidt nærmere på mit indlæg #7, så vil du se, at hvis du tester 1, 2 eller 3 - så for du som svar 1 record (dette indikerer JA).
Hvis du derimod tester med 4, 5...., så får du som svar 0 records (dette indikerer NEJ).

Specificér lidt nærmere hvad meningen var, hvis det ikke var dét.

/Jesper
Avatar billede jesperhgh Nybegynder
29. maj 2010 - 18:03 #11
...HOV, der er en tyrkfejl i din udgave:

SELECT DISTINCT ID1 FROM matchprofile WHERE ID2 = ? AND ID2 IN (SELECT DISTINCT ID1 FROM matchprofile WHERE ID1 = ?)

Jeg skrev:
select distinct id1 from test where id1=1 and id1 in (select distinct id2 from test where id2=1);

Du har byttet lidt rundt på ID1 og ID2.

prøv at cut'n'paste dette:
select distinct id1 from test where id1=1 and id1 in (select distinct id2 from test where id2=1);

/Jesper
Avatar billede jesperhgh Nybegynder
29. maj 2010 - 18:03 #12
...HOV, der er en tyrkfejl i din udgave:

SELECT DISTINCT ID1 FROM matchprofile WHERE ID2 = ? AND ID2 IN (SELECT DISTINCT ID1 FROM matchprofile WHERE ID1 = ?)


select distinct id1 from test where id1=1 and id1 in (select distinct id2 from test where id2=1);
Avatar billede jesperhgh Nybegynder
29. maj 2010 - 18:20 #13
Der gik vidst lige lidt kage i Preview og Opret knapperne, men dette skulle vidst være forståeligt:

SELECT DISTINCT ID1 FROM matchprofile WHERE ID1=?
AND ID1 IN (SELECT DISTINCT ID2 FROM matchprofile WHERE ID2=?);


:o)  så tror jeg vi er der.
Avatar billede jesperhgh Nybegynder
29. maj 2010 - 20:18 #14
Et mini-mini kursus:

Først er her hele tabellen, hvor vi kan se, at 1, 2 og 3 findes i både id1 og id2:

mysql> select * from test;
+------+------+
| id1  | id2  |
+------+------+
|    1 |    2 |
|    2 |    1 |
|    3 |    1 |
|    1 |    3 |
|    4 |    1 |
|    4 |    2 |
|    5 |    3 |
+------+------+
7 rows in set (0.00 sec)

Så laver vi et distinct udtræk af id1:

mysql> select distinct id1 from test;
+------+
| id1  |
+------+
|    1 |
|    2 |
|    3 |
|    4 |
|    5 |
+------+
5 rows in set (0.00 sec)

Så laver vi et distinct udtræk af id2, som også findes i vores foregående udtræk af id1, så her genbruger vi:
select distinct id1 from test som et subquery, idet vi husker at sætte parentes om:


mysql> select distinct id2 from test where id2 in (select distinct id1 from test);
+------+
| id2  |
+------+
|    2 |
|    1 |
|    3 |
+------+
3 rows in set (0.00 sec)

Nu har vi så et query, der fortæller os hvilke ID'er som er brugt både til id1 og id2.
Og hvis vi så vil teste om et givent ID er både id1 og id2, så er det jo bare at spørge:


mysql> select id1 as er_dublet from test where id1=2 and id1 in (select distinct id2 from test where id2 in (select distinct id1 from test));
+-----------+
| er_dublet |
+-----------+
|        2 |
+-----------+
1 row in set (0.00 sec)


Det giver nogle lange linier, i forhold til denne 1/3 af skærmen som eksperten.dk vil give os - men cut'n'paste det du vil bruge, så undgår du også de tidligere tyrkfejl.



/Jesper
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Computerworld tilbyder specialiserede kurser i database-management

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester