Avatar billede baitianlong Nybegynder
17. juni 2008 - 19:50 Der er 8 kommentarer og
1 løsning

Hjaelp til SQL saetning

Jeg skal bruge en sql saetning, som kan give mig det substringede element som har flest forekomster i databasen og samtidig antallet af forekomster.

Eksempel:

URL           
http://www.eksperten.dk/blahblah/hej.php
http://www.cnn.com/23423
http://www.abc.net/234/464/sfd/davs.asp
http://www.eksperten.dk/stuff/hurra.php
http://www.bbc.co.uk/sdfs

I dette tilfaelde skal ResultSettet indeholde vaerdierne:
"http://www.eksperten.dk" , 2

Alle urls har en skraastreg efter TLD, saa den kan bruges til substring i sql saetningen.

Haaber paa hurtig hjaelp. Jeg tror ikke det er saa vanskeligt, men jeg er ikke saa erfaren med group by og lign.
Avatar billede arne_v Ekspert
19. juni 2008 - 04:32 #1
SELECT SUBSTRING(url,1,LOCATE('/',url,LOCATE('//',url)+2)),COUNT(*) AS n
FROM urltbl
GROUP BY SUBSTRING(url,1,LOCATE('/',url,LOCATE('//',url)+2))
ORDER BY n DESC
LIMIT 1;
Avatar billede baitianlong Nybegynder
20. juni 2008 - 08:35 #2
Hej Arne,

Det er sgu smukt... Den virker perfekt :)

Tusind tak.
Avatar billede baitianlong Nybegynder
20. juni 2008 - 09:08 #3
Men lige een ting mere... Der er ogsaa et tidselement, og jeg havde haabet paa at jeg bare kunne putte det ind, saa saetningen er saaledes:

SELECT SUBSTRING(url,1,LOCATE('/',url,LOCATE('//',url)+2)),COUNT(*) AS n
FROM blogcomment WHERE TIME_TO_SEC(TIMEDIFF('2008-06-01 00:00:00', date)) < 0
GROUP BY SUBSTRING(url,1,LOCATE('/',url,LOCATE('//',url)+2))
ORDER BY n DESC
LIMIT 1;

Men det virker desvaerre ikke. Kan du hjaelpe med den ogsaa? Man skal vel have en embedded select ind, eller noget.

Det er nemlig denne java kode, jeg vil goere lettere ved at have en bedre sql saetning.

Map tempmap = new HashMap();
        try {
            Statement stmt = createConnection().createStatement();
            String sql = "SELECT url FROM blogcomment WHERE TIME_TO_SEC(TIMEDIFF('" + DatabaseFunctions.formatDateSQLFull(sincedate) + "',date)) < 0";
            ResultSet rs = stmt.executeQuery(sql);
            while(rs.next()) {
                String scrapedurl = DatabaseFunctions.scrapeUrl(rs.getString("url"));
                if(tempmap.containsKey(scrapedurl)) {
                    int number = Integer.parseInt(tempmap.get(scrapedurl).toString());
                    int newnumber = number + 1;
                    tempmap.remove(scrapedurl);
                    tempmap.put(scrapedurl, newnumber);
                } else {
                    tempmap.put(scrapedurl,0);
                }
            }
            int highestnumber = 0;
            String highesturl = "";
            for(Object o: tempmap.keySet()) {
                String scrapedurl = o.toString();
                int number = Integer.parseInt(tempmap.get(scrapedurl).toString());
                if(number >= highestnumber) {
                    highestnumber = number;
                    highesturl = scrapedurl;
                }
            }
Avatar billede arne_v Ekspert
21. juni 2008 - 04:09 #4
Kan du uddybe "virker desvaerre ikke" ?
Avatar billede baitianlong Nybegynder
22. juni 2008 - 09:14 #5
Ja, uanset hvad jeg saetter datoen til faar jeg samme resultat.

Hvis jeg saetter datoen til f.eks 2008-06-01 00:00:00
Faar jeg resultatet n=742 (441 warnings)

Hvis jeg saetter datoen til 2008-05-01 00:00:00
Faar jeg resultatet n=742 (1554 warnings)
Avatar billede arne_v Ekspert
22. juni 2008 - 20:27 #6
kan:

WHERE TIME_TO_SEC(TIMEDIFF('2008-06-01 00:00:00', date)) < 0

ikke laves som:

date > '2008-06-01 00:00:00'

?
Avatar billede arne_v Ekspert
22. juni 2008 - 20:28 #7
Og date ligner grangiveligt et reserveret ord, så enten omdøb feltet eller:

`date` > '2008-06-01 00:00:00'
Avatar billede baitianlong Nybegynder
23. juni 2008 - 10:41 #8
Hej Igen Arne.

date er ikke et reserveret ord i mysql

http://www.ispirer.com/doc/sqlways38/Output/SQLWays-1-199.html

Bortset fra det... sql saetningen med datediff og det hele virker fint. Det var simpelthen fordi den hoejeste var den samme (med samme antal) med forskellige datoer. Hvis jeg aendrede datoen til 2008-06-10 var resultatet anderledes. Det burde jeg nok have proevet inden jeg brokkede mig. Beklager.

Du har i oevrigt ogsaa ret i at dato-elementet kan reduceres til det du skriver. Der behoever ikke vaere time_to_sec og timediff.

Saa jeg takker igen for endnu en fin loesning og du bedes laegge et svar.
Avatar billede arne_v Ekspert
23. juni 2008 - 14:38 #9
svar
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