Avatar billede bondester Nybegynder
18. oktober 2006 - 19:21 Der er 14 kommentarer og
1 løsning

Sorter efter antal records

Hejsa

Jeg er ved at udvide de 2 rejsesider www.TanjaogSuzOnTour.dk og www.TinaogLouiseOnTour.dk

Jeg vil gerne lave sådan at jeg kan vise de mest besøgte billeder.
Hver gang et billede besøges registreres det i databasen.

Kan egentlig godt lave det i ASP hvor det bliver talt sammen ved en løkke, men det kommer jo på et tidspunkt til at tage meget længe, så vil høre om der ikke findes en SQL kommando der kan klare det??

Databasen ser således ud:
id - int(10) (auto_increment)
type - text (ved billeder står der billede i denne, der registreres også hits på dagbøgerne f.eks. - derfor denne)
hit_id - int(10) (er det id billedet har)
ip - text (bare sådan for sjov skyld)
dato - timestamp (jaaa dato og klokken hvor hittet fandt sted)

Håber nogen kan hjælpe....

/Cowman
Avatar billede langthjem Nybegynder
18. oktober 2006 - 19:30 #1
Kom lige med layout på din tabel med billeder og den med registreringer.
Avatar billede bondester Nybegynder
18. oktober 2006 - 19:40 #2
Har bare taget en eksport via phpMyAdmin, håber det er nok ellers siger du bare til hvad du skal bruge...

CREATE TABLE `ts_hits` (
  `id` int(10) unsigned NOT NULL auto_increment,
  `type` text collate latin1_danish_ci NOT NULL,
  `hit_id` int(10) unsigned NOT NULL default '0',
  `ip` text collate latin1_danish_ci NOT NULL,
  `dato` timestamp NOT NULL default '0000-00-00 00:00:00',
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_danish_ci COMMENT='Indeholder alle registrerede hits på siden' AUTO_INCREMENT=440 ;

INSERT INTO `ts_hits` (`id`, `type`, `hit_id`, `ip`, `dato`) VALUES (85, 'dagbog', 1, '62.243.87.13', '2006-10-15 18:55:21');
INSERT INTO `ts_hits` (`id`, `type`, `hit_id`, `ip`, `dato`) VALUES (86, 'dagbog', 2, '62.243.87.13', '2006-10-15 18:57:37');
INSERT INTO `ts_hits` (`id`, `type`, `hit_id`, `ip`, `dato`) VALUES (87, 'dagbog', 1, '80.197.125.134', '2006-10-15 21:01:38');
INSERT INTO `ts_hits` (`id`, `type`, `hit_id`, `ip`, `dato`) VALUES (88, 'dagbog', 2, '80.197.125.134', '2006-10-15 21:03:19');
INSERT INTO `ts_hits` (`id`, `type`, `hit_id`, `ip`, `dato`) VALUES (89, 'billede', 59, '212.242.183.147', '2006-10-15 21:27:07');
INSERT INTO `ts_hits` (`id`, `type`, `hit_id`, `ip`, `dato`) VALUES (90, 'billede', 14, '212.242.183.147', '2006-10-15 21:28:40');
INSERT INTO `ts_hits` (`id`, `type`, `hit_id`, `ip`, `dato`) VALUES (91, 'billede', 16, '212.242.183.147', '2006-10-15 21:28:59');
INSERT INTO `ts_hits` (`id`, `type`, `hit_id`, `ip`, `dato`) VALUES (92, 'billede', 44, '212.242.183.147', '2006-10-15 21:29:48');
INSERT INTO `ts_hits` (`id`, `type`, `hit_id`, `ip`, `dato`) VALUES (93, 'billede', 71, '212.242.183.147', '2006-10-15 21:33:28');
INSERT INTO `ts_hits` (`id`, `type`, `hit_id`, `ip`, `dato`) VALUES (94, 'billede', 72, '212.242.183.147', '2006-10-15 21:33:42');
Avatar billede langthjem Nybegynder
18. oktober 2006 - 19:43 #3
Det er jo kun din tabel med hits... hvad med den hvor alle emnerne er registreret?
Avatar billede langthjem Nybegynder
18. oktober 2006 - 19:46 #4
Har lige kigget på siderne ... du skal beskytte deres e-mail adresser, det er guf for spammere når e-mail adresser står frit fremme.
Avatar billede bondester Nybegynder
18. oktober 2006 - 19:50 #5
Fungerer som et CMS system, så jeg bestemmer ikke hvad de ligger på forsiden...
Her kommer et dump af tabellen med billederne:

CREATE TABLE `ts_billeder` (
  `id` int(10) unsigned NOT NULL auto_increment,
  `ref` text collate latin1_danish_ci NOT NULL,
  `overskrift` text collate latin1_danish_ci NOT NULL,
  `tekst` text collate latin1_danish_ci NOT NULL,
  `dato` datetime NOT NULL default '0000-00-00 00:00:00',
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_danish_ci COMMENT='Indeholder alle uploadede billeder' AUTO_INCREMENT=85 ;

INSERT INTO `ts_billeder` (`id`, `ref`, `overskrift`, `tekst`, `dato`) VALUES (17, 'http://www.TanjaogSuzOnTour.dk/upload/Picture_014.jpg', 'Party', 'Suz og jeg nyder en kold oel efter ankomst til vandrehjemmet', '2006-09-11 08:25:27');
INSERT INTO `ts_billeder` (`id`, `ref`, `overskrift`, `tekst`, `dato`) VALUES (15, 'http://www.TanjaogSuzOnTour.dk/upload/Picture_012.jpg', 'Sovetryne', ' Hi hi... ', '2006-09-11 08:20:40');
INSERT INTO `ts_billeder` (`id`, `ref`, `overskrift`, `tekst`, `dato`) VALUES (16, 'http://www.TanjaogSuzOnTour.dk/upload/Picture_013.jpg', 'Lang rejse', 'Tanja er meget traet efter en meget lang rejse!', '2006-09-11 08:23:32');
INSERT INTO `ts_billeder` (`id`, `ref`, `overskrift`, `tekst`, `dato`) VALUES (13, 'http://www.TanjaogSuzOnTour.dk/upload/Picture_008.jpg', 'Fly mad', ' Saa er der dejligt fly mad !!', '2006-09-11 08:18:58');
INSERT INTO `ts_billeder` (`id`, `ref`, `overskrift`, `tekst`, `dato`) VALUES (14, 'http://www.TanjaogSuzOnTour.dk/upload/Picture_009.jpg', 'Fly mad 2', 'Saa er der dejlig fly mad !!', '2006-09-11 08:19:52');
INSERT INTO `ts_billeder` (`id`, `ref`, `overskrift`, `tekst`, `dato`) VALUES (12, 'http://www.TanjaogSuzOnTour.dk/upload/Picture_007.jpg', 'Flyveturen', 'Så er vi klar til den lange tur i flyveren', '2006-09-11 08:16:49');
INSERT INTO `ts_billeder` (`id`, `ref`, `overskrift`, `tekst`, `dato`) VALUES (11, 'http://www.TanjaogSuzOnTour.dk/upload/Picture_006.jpg', 'Aegte Backpacker', 'Tanja skal lige vende sig til den tunge ryg taske !!', '2006-09-11 08:16:09');
INSERT INTO `ts_billeder` (`id`, `ref`, `overskrift`, `tekst`, `dato`) VALUES (18, 'http://www.TanjaogSuzOnTour.dk/upload/Picture_016.jpg', 'Goodmorning Sydney', 'Kl. 05 dagen efter ankomst ', '2006-09-11 08:26:47');
INSERT INTO `ts_billeder` (`id`, `ref`, `overskrift`, `tekst`, `dato`) VALUES (19, 'http://www.TanjaogSuzOnTour.dk/upload/Picture_017.jpg', 'Goodmorning Sydney', ' humm...frisk ?!?! :)', '2006-09-11 08:28:13');
INSERT INTO `ts_billeder` (`id`, `ref`, `overskrift`, `tekst`, `dato`) VALUES (20, 'http://www.TanjaogSuzOnTour.dk/upload/Picture_018.jpg', 'Pas paa', 'Her laver vi mad i kokkenet paa vandrehjemmet', '2006-09-11 08:29:16');
Avatar billede langthjem Nybegynder
18. oktober 2006 - 19:57 #6
Ok, nu kan vi begynde at lege. Jeg har ikke testet følgende, men jeg håber det vil virke.

#CODE#
SELECT ts_billeder.id,ts_billeder.overskrift,COUNT(ts_hits.id) AS hits FROM ts_billeder LEFT JOIN ts_hits ON (tshits.hit_id = ts_billeder.id) GROUP BY ts_billeder.id ORDER BY COUNT(ts_hits.id) DESC
#CODE#

Jeg ville formode at dette burde virke. Prøv engang.
Avatar billede langthjem Nybegynder
18. oktober 2006 - 19:59 #7
Btw... en ekstra lille ting. Det CMS sjov kan du rette på følgende måde:
Når indholdet skrives til siden bruger du en Replace(strIndhold,"@","[snabela]")
Og i din head indsætter du dette java script:

<script type="text/javascript">
function FixEmail() {
    var mailDivider = '[snabela]';

    arrLinks = document.getElementsByTagName('A');
    for (i=0;i<arrLinks.length;i++) {
        if (arrLinks[i].href.indexOf(mailDivider) != -1) {
            arrLinks[i].href = arrLinks[i].href.split(mailDivider)[0] + '@' + arrLinks[i].href.split(mailDivider)[1];
        }

        if (arrLinks[i].innerHTML.indexOf(mailDivider) != -1) {
            arrLinks[i].innerHTML = arrLinks[i].innerHTML.split(mailDivider)[0] + '@' + arrLinks[i].innerHTML.split(mailDivider)[1];
        }
    }
}

window.onload = FixEmail;
</script>
Avatar billede bondester Nybegynder
18. oktober 2006 - 20:06 #8
Okay det virker faktisk meget smart med det link ;-)

Jeg rettede din SQL lidt til (der manglede lige en _ ved den ene og så tilføjede jeg ts_billeder.ref da det er den der refererer til kilden)

Set rsBilledeHitliste = Conn.Execute("SELECT ts_billeder.id,ts_billeder.overskrift,ts_billeder.ref,COUNT(ts_hits.id) AS hits FROM ts_billeder LEFT JOIN ts_hits ON (ts_hits.hit_id = ts_billeder.id) GROUP BY ts_billeder.id ORDER BY COUNT(ts_hits.id) DESC")

Når jeg så udskriver det på siden skriver jeg rsBilledeHitliste("ts_billeder.ref") <-- Er det rigtigt??
Avatar billede bondester Nybegynder
18. oktober 2006 - 20:07 #9
Og så glemte jeg at skrive fejlen ;-)

[MySQL][ODBC 3.51 Driver][mysqld-4.1.11-log]Invalid use of group function
Avatar billede langthjem Nybegynder
18. oktober 2006 - 20:11 #10
Hmm... noget rigtig æv! Det burde have virket... jeg vender lige tilbage til dig imorgen, så kigger jeg lige på det.
Avatar billede bondester Nybegynder
18. oktober 2006 - 20:18 #11
Okay...

Der er ikke nogen som kan hjælpe i mellemtiden??
Sidder lige med koden op over begge ører ;-)
Avatar billede bondester Nybegynder
18. oktober 2006 - 22:23 #12
Nååå jeg fandt selv frem til en løsning... Ikke sikker på den er helt "lovlig", men her kommer den..

Jeg tilføjede et tinyint(1) til tabellen ts_hits, og så brugte jeg følgende SQL:

SELECT id,type,hit_id,SUM(sum_felt) AS hits_sum FROM ts_hits WHERE type = 'billede' GROUP BY hit_id ORDER BY hits_sum DESC LIMIT 0, 1

Det virker perfekt, og tror faktisk ikke det belaster DB så meget igen, men kom med andet forslag hvis du kan!
Avatar billede bondester Nybegynder
18. oktober 2006 - 22:24 #13
tinyint(1) feltet hedder selvfølgelig sum_felt og har en standardværdi på 1
Avatar billede bondester Nybegynder
21. oktober 2006 - 00:57 #14
Har jeg virkelig selv fundet den optimale løsning?? Så skulle det da være første gang ;-)
Ingen der har en bedre SQL løsning?
Avatar billede bondester Nybegynder
21. oktober 2006 - 11:41 #15
Jeg lukker og tror på det er den bedste løsning jeg har fundet!
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