Gå til innhold

Fryktelig tungvint SQL?


Anbefalte innlegg

Jeg er ikke akkurat noe reser i SQL må jeg innrømme, og lurer derfor på hvordan SQLen her ser ut? Er det mye som kan/bør forandres for å få det litt mer "økonomisk"?

<?php
$query = "SELECT * FROM acdc_rumour, acdc_user
   WHERE acdc_rumour.user_id = acdc_user.user_id ORDER BY created DESC";
$result = mysql_query($query) or die("Query failed : " . mysql_error());

while ($record = mysql_fetch_assoc($result))
{   
   $created = strtotime($record['created']);
   $created = date("jS F Y @ H:i", $created);
   echo $created." by <a href='mailto:".$record['email']."'>".$record['username']."</a>";
   if($record['updated'] <> NULL)
   {
       $query2 = "SELECT * from acdc_user, acdc_rumour
           WHERE acdc_rumour.updated_by = acdc_user.user_id AND acdc_rumour.rumour_id = ".$record['rumour_id'];
       $result2 = mysql_query($query2) or die("Query failed : " . mysql_error());
       $record2 = mysql_fetch_assoc($result2);
       $updated = strtotime($record['updated']);
       $updated = date("jS F Y @ H:i", $updated);
       echo " - Last updated: ".$updated." by <a href='mailto:".$record2['email']."'>".$record2['username']."</a><br/><br/>";
   }
   else
   {
       echo "<br/><br/>";
   }
   echo "<b>".$record['title']."</b><br/><br/>";
   echo make_html(nl2br($record['rumour']))."<br/><br/>";
   $user_id = $record['user_id'];
   $rumour_id = $record['rumour_id'];
   
   if($_SESSION['loggedin'] == "true" && ((usercheck() && $_SESSION['user_id'] == $user_id) || admincheck()))
   {
       echo "<a href='index.php?page=rumour_edit&id=$rumour_id'>Edit Rumour</a> - ";
   }
   
   $query3 = "SELECT COUNT(*) as num FROM acdc_comment WHERE rumour_id=$rumour_id";
   $result3 = mysql_query($query3) or die("Query failed : " . mysql_error());
   $record3 = mysql_fetch_assoc($result3);
   $num = $record3['num'];
   
   echo "<a href='index.php?page=rumour_comment&id=$rumour_id'>Add/View Comments (".$num.")</a><hr>";
}
?>

Endret av Pangaea
Lenke til kommentar
Videoannonse
Annonse

:scared:

 

Det er også mye bedere å bruke functions, indenting, switch.

Et helt kapittel i php-bibelen min heter "Organazing your code".

 

Din kode er et eksempel på spagetti :p

 

Prøv å strukturere koden din mer "ryddig" først :yes: , så noen orker å lese den.

 

Det kan også som sagt over, være greit om du viste oss db-strukturen din.

Lenke til kommentar

Ok, db struktur...

CREATE TABLE acdc_rumour (

rumour_id INTEGER(6) UNSIGNED NOT NULL AUTO_INCREMENT,

user_id INTEGER(6) UNSIGNED NOT NULL,

created DATETIME NOT NULL,

updated DATETIME NULL,

updated_by INTEGER(6) UNSIGNED NULL,

title Varchar(100) NOT NULL,

rumour TEXT NOT NULL,

PRIMARY KEY(rumour_id),

INDEX acdc_rumour_FKIndex1(user_id)

);

 

CREATE TABLE acdc_user (

user_id INTEGER(6) UNSIGNED NOT NULL AUTO_INCREMENT,

username Varchar(50) NOT NULL,

pass Varchar(100) NOT NULL,

email Varchar(100) NOT NULL,

firstname Varchar(50) NULL,

lastname Varchar(50) NULL,

bday_day INTEGER(2) UNSIGNED NULL,

bday_month INTEGER(2) UNSIGNED NULL,

bday_year INTEGER(4) UNSIGNED NULL,

country_id INTEGER(3) UNSIGNED NOT NULL,

location Varchar(50) NULL,

url Varchar(100) NULL DEFAULT 'http://',

icq Varchar(50) NULL,

msn Varchar(100) NULL,

notes TEXT NULL,

user_active ENUM('0','1') NOT NULL,

user_level ENUM('0','1','2','3') NOT NULL,

joined DATETIME NOT NULL,

last_login DATETIME NOT NULL,

PRIMARY KEY(user_id),

INDEX acdc_user_FKIndex1(country_id)

);

 

CREATE TABLE acdc_comment (

comment_id INTEGER(6) UNSIGNED NOT NULL AUTO_INCREMENT,

name Varchar(100) NOT NULL,

date DATETIME NOT NULL,

text TEXT NOT NULL,

book_id INTEGER(3) UNSIGNED NULL,

rumour_id INTEGER(6) UNSIGNED NULL,

trader_id INTEGER(6) UNSIGNED NULL,

release_id INTEGER(6) UNSIGNED NULL,

album_id INTEGER(2) UNSIGNED NULL,

member_id INTEGER(2) UNSIGNED NULL,

song_id INTEGER(4) UNSIGNED NULL,

bootleg_id INTEGER(6) UNSIGNED NULL,

news_id INTEGER(6) UNSIGNED NULL,

article_id INTEGER(6) UNSIGNED NULL,

PRIMARY KEY(comment_id),

INDEX acdc_comment_FKIndex1(article_id),

INDEX acdc_comment_FKIndex2(news_id),

INDEX acdc_comment_FKIndex3(bootleg_id),

INDEX acdc_comment_FKIndex4(song_id),

INDEX acdc_comment_FKIndex5(member_id),

INDEX acdc_comment_FKIndex6(album_id),

INDEX acdc_comment_FKIndex7(release_id),

INDEX acdc_comment_FKIndex8(trader_id),

INDEX acdc_comment_FKIndex9(rumour_id),

INDEX acdc_comment_FKIndex10(book_id)

);

 

Har en tabell for alle kommentarer, som jeg så kobler mot hva hva som blir kommentert. Synst det ble for mye å ha en egen kommentartabell til alle tingene man kan legge inn kommentarer til.

 

Jeg ønsker å få ut nyhetene (eller rykter i dette tilfellet) på en side. Først skal det stå når det ble lagt inn i databasen og av hvem, med email. Om ryktet har blitt oppdatert skal det også komme med med hvem som har oppdatert, når og med email.

Så kommer selve ryktet.

Til slutt en link til hvor man kan se/legge inn kommentarer til artikkelen, med hvor mange kommentarer som er lagt inn til hver artikkel. Det fungerer sånn som det er nå, men det er vel ganske klønete kodet.

 

Hvordan skal man løse SQL-biten? Join og subselect er ganske gresk for meg, må det brukes?

Lenke til kommentar

Ikke for å være frekk eller noe men jeg ville foreslå at du begynner med et enkelt oppsett og får mere kjøtt på beina vedrørende programmering og sql.

 

Dette er ikke vondt ment men den koden du presenterte der minner veldig om noe ferdig kvernet kode fra modelator eller lignende. Min mening er at du bør skrive mer av dette selv så vil du kjapt se løsningene. Prøv phpmyadmin et utrolig bra værktøy for mySQL databaser.

Lenke til kommentar

Sorry for å bumpe denne her, men lurer fortsatt på om noen har forslag til hvordan jeg eventuelt kan spare litt på sql-biten. Jeg ser det ikke selv, siden alle har ulike where...

Sånn som det er nå, blir det 2 eller 3 queries per nyhet, hadde selfølgelig vært bedre med en query per nyhet. Er det mulig å få det til?

Lenke til kommentar

Det første jeg legger merke til, er at $query1 = $query2 = "SELECT * from acdc_user, acdc_rumour" !

 

Hvorfor har du brukt 2 like spørringer ?

 

For det andre er det heller ikke veldig smart å bruke * i select queries,

da dette tar lenere tid og hvis du enevtuelt skulle legge til et felt i tabellen, så ville også denne bli valgt. Bruk derfor : "SELECT username,news,posted..... FROM ......"

dette er mye raskere.

Vis det er nyheter som shal "printes", kan det jo være greit å ha flere sider og bruke LIMIT i mysql queries, da dette også sparer på resursene.

 

Vil også informere at mysql_fetch_row() er mye raskere enn mysql_fetch_assoc().

 

:)

Lenke til kommentar
Det første jeg legger merke til, er at $query1 = $query2 = "SELECT * from acdc_user, acdc_rumour" !

 

Hvorfor har du brukt 2 like spørringer ?

 

For det andre er det heller ikke veldig smart å bruke * i select queries,

da dette tar lenere tid og hvis du enevtuelt skulle legge til et felt i tabellen, så ville også denne bli valgt. Bruk derfor : "SELECT username,news,posted..... FROM ......"

dette er mye raskere.

 

hvorfor er det raskere? jeg kjenner ikke detaljene, men å ukritisk bare hente alt kan høres kjappere ut enn å måtte gå inn og finne de spesifike kolonnene man er ute etter.

 

Vil også informere at mysql_fetch_row() er mye raskere enn mysql_fetch_assoc().

 

:)

 

Dette er feil, det står i manualen at alle tre mysql_fetch_* metodene er like kjappe.

Endret av Torbjørn
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...