Avatar billede bondester Nybegynder
18. september 2011 - 14:14 Der er 8 kommentarer og
1 løsning

SQL køres på alle databaser fra tidligere SQL

Jeg skal have lidt hjælp til en JOIN i min MySQL database. Som så mange gange før har jeg løst problemet med kodning i ASP, men det kræver (også som så mange gange før) for meget CPU-kraft og er sikker på det kan løses direkte i en SQL.

Jeg har en database som hedder admin i den er der en tabel som hedder server og i den en kollonne der hedder ref_db

Mit problem er at på alle de databaser der er listet i admin.server.ref_db skal nedenstående SQl køres og der skulle derefter meget gerne ORDER BY antal efterfølgende.

SELECT COUNT(*) AS antal FROM UDTRÆK_FRA_DB1.gal WHERE last_update > ASP_FUNKTION_DER_BEREGNER_DATO

Udeoverovenstående findes der så egentlig en funktion direkte i SQL som kan beregne en dato minus 7 dage?? last_update er af datetime-format.

//bondester
Avatar billede majbom Novice
18. september 2011 - 14:27 #1
Avatar billede bondester Nybegynder
18. september 2011 - 14:59 #2
Tæt på... Jeg brugte SUBDATE, dagene skulle trækkes fra ;-)

Så jeg fik styr på den lille del af spørgsmålet ;-)
SELECT COUNT(*) AS antal FROM UDTRÆK_FRA_DB1.gal WHERE last_update > SUBDATE(SYSDATE(),7)

Men hvad så med JOIN'en??
Avatar billede majbom Novice
18. september 2011 - 15:02 #3
jeg tror ikke du kan joine tabeller på tværs af databaser...
Avatar billede bondester Nybegynder
18. september 2011 - 15:49 #4
Okay... Jeg prøver at lade den stå åben et par dage for at se om der kommer nogle løsninger!

//bondester
Avatar billede Slettet bruger
18. september 2011 - 20:24 #5
Du kan godt joine tabeller på tværs af databaser, bare ikke på den måde som du gerne vil have det gjort, fordi dine database navne ligger i en tabel.

To måder at løse det på:

1) Du laver noget kode der først henter database navnene fra din tabel, og bagefter konstruerer en sql query i stil med:

SELECT COUNT(*) AS antal, <database1> AS db FROM <database1>.gal WHERE last_update > SUBDATE(SYSDATE(),7)
UNION ALL
SELECT COUNT(*) AS antal, <database2> AS db FROM <database2>.gal WHERE last_update > SUBDATE(SYSDATE(),7)
UNION ALL
osv...
ORDER BY antal

hvor du erstatter <database1>, <database2>, med dine database-navne. Denne sql query eksekverer du så i din kode.

2. Du laver en stored procedure der gør det samme, så kan du nøjes med 1 database kald i stedet for 2.
Avatar billede bondester Nybegynder
19. september 2011 - 21:18 #6
tolamaps <-- Det var meget tæt på at virke... Der skulle lige lidt ' rundt om det første databasenavn så det kommer til at se sådan ud:

SELECT COUNT(*) AS antal, '<database1>' AS db FROM <database1>.gal WHERE last_update > SUBDATE(SYSDATE(),7)
UNION ALL
SELECT COUNT(*) AS antal, '<database2>' AS db FROM <database2>.gal WHERE last_update > SUBDATE(SYSDATE(),7)
UNION ALL
osv...
ORDER BY antal

Jeg prøver at implementerer løsningen og se hvordan det loader, ellers må jeg tyde til Stored Procedure... Smid et svar og du skal få point, samme til splazz hvis du vil have lidt for SYSDATE()

Takker for hjælpen...

//bondester
Avatar billede majbom Novice
19. september 2011 - 21:24 #7
svar - men giv hoveddelen til tolamaps :)
Avatar billede Slettet bruger
19. september 2011 - 21:30 #8
Ellers tak, så pointene giver du bare til splazz.
Avatar billede majbom Novice
20. september 2011 - 19:55 #9
jamen tak for point så :)
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