Gå til innhold

Top 5 kommenterte saker i to tabeller.


Anbefalte innlegg

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 av exmx
Lenke til kommentar
Videoannonse
Annonse
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
  • 2 uker senere...

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

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 konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...