exmx Skrevet 6. august 2009 Del Skrevet 6. august 2009 (endret) Jeg har 3 tabeller: comments, news, og photos. I news og photos lagres artikler og bilder uavhengig av hverandre. Brukerne på siden har mulighet for å kommentere til disse. I comments lagres altså selve kommentaren + id'en til enten news (news_id) eller photos (photos_id). Det jeg prøver å få til er en "top 5 mest kommenterte saker" på framsiden. Enten det er i en artikkel, eller til et bilde. Men jeg er veldig usikker på hvordan SQL-spørringen skal se ut å tenkte kanskje noen her inne kunne komme med et forslag CREATE TABLE `comments` ( `comment_id` INT( 11 ) NOT NULL AUTO_INCREMENT PRIMARY KEY , `comment_nr` INT( 11 ) NOT NULL , `date` DATETIME NOT NULL , `text` TEXT NOT NULL , `news_id` INT( 11 ) NULL , `user_id` INT( 11 ) NOT NULL , `photo_id` INT( 11 ) NULL ); CREATE TABLE `news` ( `news_id` INT( 11 ) NOT NULL , `date` DATE NOT NULL , `title` VARCHAR( 100 ) NOT NULL , `text` TEXT NOT NULL , `user_id` INT( 11 ) NOT NULL , `is_public` VARCHAR( 3 ) NOT NULL DEFAULT 'No', PRIMARY KEY ( `news_id` ) ); CREATE TABLE `photos` ( `photos_id` INT( 11 ) NOT NULL , `date` DATETIME NOT NULL , `text` TEXT NULL , `path` VARCHAR( 100 ) NOT NULL , `size` INT( 4 ) NOT NULL , `resolution` VARCHAR( 10 ) NOT NULL , `mime-type` VARCHAR( 50 ) NOT NULL , `album_id` INT( 11 ) NOT NULL , PRIMARY KEY ( `photos_id` ) ); Takk på forhånd ^^ Endret 20. august 2009 av exmx Lenke til kommentar
luxus Skrevet 6. august 2009 Del Skrevet 6. august 2009 Kanskje noe ala: SELECT n.*, count(*) AS news_comments_count FROM news n INNER JOIN comments c USING(news_id) GROUP BY n.news_id ORDER BY news_comments_count DESC LIMIT 5 Lenke til kommentar
exmx Skrevet 6. august 2009 Forfatter Del Skrevet 6. august 2009 Kanskje noe ala: SELECT n.*, count(*) AS news_comments_count FROM news n INNER JOIN comments c USING(news_id) GROUP BY n.news_id ORDER BY news_comments_count DESC LIMIT 5 Spørringen din rangerer bare kommenterte news. jeg har også en photoalbum-tabell jeg vil ha med i rangeringen. Men ellers takk Lenke til kommentar
exmx Skrevet 20. august 2009 Forfatter Del Skrevet 20. august 2009 *bump* Redigert første posten litt så kanskje folk forstår hva jeg er ute etter Lenke til kommentar
kaffenils Skrevet 20. august 2009 Del Skrevet 20. august 2009 Hvilke kolonner skal spørringen returnere? I news har du en title kolonne, men det har du ikke i photos. Der har du kun en potensielt gigantisk kolonne som heter text. Før vi tar fatt på alternativene så vil jeg påpeke at det ikke er særlig lurt å gjøre denne spørringen mot live data for hver eneste sidevisning. En sortert top(x) av count+group vil mest sannsynlig medføre en index/table scan som ikke er særlig effektivt. Jeg ville schedulert en jobb (hvor ofte er opp til deg) som kopierte resutatet av spørringen inn i en egen Top5 tabell og så bruker du denne som utgangspunkt når du presenterer informasjonen p åwebsiden, eller hvor det nå skal være. Jeg kommer på to alternativer i farten: #1: Lage to spørringer. Den ene returnerer top 5 kommentar count for photos og den andre tilsvarende for news. I koden din merger du disse radene og leser de fem med flest kommentarer. #2: Gjør mergingen i #1 på databaseserveren ved f.eks. å benytte UNION ALL og hente ut top 5 rader basert på count fra UNION ALL resultatet. Prøv litt selv, og kom spør heller hvis du sitter fast et sted med spørringen. Du lærer mye bedre av det enn om jeg gir deg "fasiten". Lenke til kommentar
Anbefalte innlegg
Opprett en konto eller logg inn for å kommentere
Du må være et medlem for å kunne skrive en kommentar
Opprett konto
Det er enkelt å melde seg inn for å starte en ny konto!
Start en kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå