Avatar billede x4all_dk Nybegynder
17. november 2005 - 15:47 Der er 6 kommentarer og
2 løsninger

Minimere SQL kald

Jeg har to tabeller, og der gælder at en Person altid har 3
telefon numre. Jeg vil gerne have en SQL som retunerer (person_id, navn,tlf_nr,tlf_nr,tlf_nr)


tbl1:
[person_id][navn]
    1        Per
    2        klaus
tbl2:
[person_id][tlf_nr]
    1        1111
    1        1222
    1      86868686
    2          33
    2          111
    2          11111

Hvordan laver jeg en SQL som retunerer:
[1][Per]  [1111][1222][86868686]
[2][klaus][33]  [111] [11111]


Grunden til at jeg ønsker at få dette resultat fra min SQL er at undgå at skulle lave det i enten PHP eller via flere SQL's.

Giver det mening ?

Miljø: PHP 4.x, Mysql 4.x
Avatar billede shaagerup Nybegynder
17. november 2005 - 21:17 #1
Den bedste løsning vil nok være at bruge GROUP_CONCAT:

SELECT DISTINCT person_id,GROUP_CONCAT(tlf_nr) FROM tbl2 GROUP BY person_id

Denne spytter tlf-numrene ud komma-sepereret.
Avatar billede x4all_dk Nybegynder
18. november 2005 - 12:55 #2
Din løsning kunne bruges hvis ikke en bedre kommer op. Dog
kan jeg ikke helt se hvordan tbl1 er koblet på ?

Mangler der ikke noget med FROM tbl1 eller LEFT JOIN tbl1 ON tbl1.person_id=tbl2.person_id ??
Avatar billede x4all_dk Nybegynder
18. november 2005 - 13:12 #3
Efter lidt roden og læsen fandt jeg desværre ud af at jeg ikke kan bruge GROUP_CONCAT,
, da min host KUN har "MySQL 4.0.18" :(

---------------------------------------------------------------------------------
GROUP_CONCAT([DISTINCT] expr [,expr ...]
            [ORDER BY {unsigned_integer | col_name | formula} [ASC | DESC] [,col ...]]
            [SEPARATOR str_val])
This function was added in MySQL version 4.1.
---------------------------------------------------------------------------------

Hjælp mig :)
Avatar billede arne_v Ekspert
18. november 2005 - 22:47 #4
SELECT tbl1.navn,tbl2_1.tlf_nr,tbl2_2.tlf_nr,tbl2_3.tlf_nr
FROM ((tbl1 JOIN tbl2 tbl2_1 ON tbl1.person_id=tbl2_1.person_id)
JOIN tbl2 tbl2_2 ON tbl1.person_id=tbl2_2.person_id AND tbl2_2.tlf_nr>tbl2_1.tlf_nr)
JOIN tbl2 tbl2_3 ON tbl1.person_id=tbl2_3.person_id AND tbl2_3.tlf_nr>tbl2_1.tlf_nr AND tbl2_3.tlf_nr>tbl2_2.tlf_nr;
Avatar billede arne_v Ekspert
18. november 2005 - 22:48 #5
mysql> SELECT tbl1.navn,tbl2_1.tlf_nr,tbl2_2.tlf_nr,tbl2_3.tlf_nr
    -> FROM ((tbl1 JOIN tbl2 tbl2_1 ON tbl1.person_id=tbl2_1.person_id)
    -> JOIN tbl2 tbl2_2 ON tbl1.person_id=tbl2_2.person_id AND tbl2_2.tlf_nr>tbl2_1.tlf_nr)
    -> JOIN tbl2 tbl2_3 ON tbl1.person_id=tbl2_3.person_id AND tbl2_3.tlf_nr>tbl2_1.tlf_nr AND tbl2_3.tlf_nr>tbl2_2.tlf_nr;
+-------+--------+--------+----------+
| navn  | tlf_nr | tlf_nr | tlf_nr  |
+-------+--------+--------+----------+
| Per  |  1111 |  1222 | 86868686 |
| Klaus |    33 |    111 |    11111 |
+-------+--------+--------+----------+
2 rows in set (0.00 sec)
Avatar billede x4all_dk Nybegynder
23. november 2005 - 11:41 #6
Arne_v dit svar gør som jeg ønsker, desværre har jeg faktisk 10 tlf_nr i min reelle da,
knyttet til hver person. Så ... det bliver en dæbende stor SQL at skulle skrive.

Begge svar var gode, så hvis i begge point hvis i smider et svar!
Avatar billede arne_v Ekspert
23. november 2005 - 11:49 #7
svar
Avatar billede shaagerup Nybegynder
25. november 2005 - 22:24 #8
svar .. (forhåbentlig kan du få din udbyder til at opgradere - der er ikke noget værre end at køre på gammel software :-))
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