Avatar billede max1999 Juniormester
09. juni 2023 - 13:05 Der er 3 kommentarer

Optimere SQL kald

Tabel_A indeholder bl.a.
A_ID, Bruger_ID

1,1
2,2
3,4
4,5
osv

Tabel_B indeholder bl.a.
B_ID, A_ID, Type, Tal

1,1,"P", 5
2,1,"P", 3
3,1,"M", 2
osv

I dag laver jeg en i PHP loop på SELECT FROM Tabel_A
Inde i det loop laver jeg 2 select:
SELECT SUM(Tal) AS Tal FROM Tabel_B WHERE Type = 'P' && A_ID = [Tabel_A.ID] GROUP BY A_ID

SELECT SUM(Tal) AS Tal FROM Tabel_B WHERE Type = 'M' && A_ID = [Tabel_A.ID] GROUP BY A_ID

Ville gerne kunne lave det om til et SQL kald ala:

SELECT
Tabel_B_P.Tal AS M_Tal, Tabel_B_M.Tal AS M_Tal
FROM Tabel_A
LEFT JOIN (SELECT SUM(Tal) AS Tal FROM Tabel_B WHERE Type = 'P' && A_ID = [Tabel_A.ID] GROUP BY A_ID) AS Tabel_B_P
LEFT JOIN (SELECT SUM(Tal) AS Tal FROM Tabel_B WHERE Type = 'M' && A_ID = [Tabel_A.ID] GROUP BY A_ID) AS Tabel_B_M

Giver det mening?? og kan man det??
Avatar billede arne_v Ekspert
09. juni 2023 - 15:25 #1
Man kan alt, men jeg tror ikke på ideeen at joine M'er med P'er fordi der kan være forskellig antal M'er og P'er.

Jeg ville nøjes med en simpel join med ORDER BY på P og M.

SELECT Bruger_ID, Type, Tal
FROM Tabel_A JOIN Tabel_B ON Tabel_A.A_ID = Tabel_B.A_ID
ORDER BY Type
Avatar billede arne_v Ekspert
09. juni 2023 - 15:48 #2
Eller:

SELECT Bruger_ID, Type, Tal
FROM Tabel_A JOIN Tabel_B ON Tabel_A.A_ID = Tabel_B.A_ID
ORDER BY Tabel_A.A_ID, Type

hvis de skal komme i den rækkefølge.
Avatar billede erikjacobsen Ekspert
10. juni 2023 - 09:49 #3
Har jeg forstået det rigtigt, så kan du bruge et pas sub-selects.

SELECT A_id,Bruger_ID,
      (SELECT SUM(Tal) AS Tal FROM Tabel_B AS B WHERE Type = 'P' AND A.A_ID = B.A_ID) AS sum_P,
      (SELECT SUM(Tal) AS Tal FROM Tabel_B AS B WHERE Type = 'M' AND A.A_ID = B.A_ID) AS sum_M
FROM Tabel_A AS A

Det giver på de data du opgiver her

1 1      8        2
2 2 NULL NULL
3 4 NULL NULL
4 5 NULL NULL
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

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