Gå til innhold

[Løst] Problem med MySql Query


Anbefalte innlegg

Hei, jeg har laget en liten side der folk kan abonnere på andre, har problemer med nyhetsfeed som på facebook.

Jeg har en liste som velger ut det siste postene for de jeg abonnere på, problemet er at jeg kun får en post og at de er i feil rekkefølge. Kan noen ta en titt? Ønske er å slå sammen to tabeller som vil vise absolut siste post fra dem jeg følger øverst. Takk for all hjelp!

 

Slik ser PHP koden ut som jeg selv har skrevet;

 

<?php
$me = $_SESSION['userid'];
$get_w = mysql_query("SELECT * FROM abonnenter WHERE bruker='$me'");
$check_get_frn = mysql_num_rows($get_w);
if (empty($check_get_frn)) {
echo 'Legg til folk for å se poster.';
} else {
while($get_frn = mysql_fetch_array($get_w)) {
$setn = $get_frn['venn'];
$set_name = mysql_query("SELECT * FROM alle_brukere WHERE userid='$setn'");
$show_name = mysql_fetch_array($set_name);
$select_post = mysql_query("SELECT * FROM poster WHERE post_bruker='$setn' AND bruker='$setn' ORDER BY id DESC");
$show_feed = mysql_fetch_array($select_post);
}
?>

Lenke til kommentar
Videoannonse
Annonse

mysql_fetch_array returnerer hele resultatsettet, så du trenger ikke å ekskvere den i en while loop. Ta en kikk her http://php.net/manual/en/function.mysql-fetch-array.php så kan du se hvordan den kan brukes. Du kan forøvrig kjøre hele den SQLen som 1 query istedetfor å kjøre 3 forskjellige selects, eventuelt bare slå sammen de 2 siste om du vil beholde den if else saken du har der.

Lenke til kommentar

Hehe, det går helt fint du! For jeg har ikke problemer med å få resultater, hehe! Men jeg har ikke logikken på rette plassen akkurat på dette området, for jeg vil ha den siste posten av de jeg abonnerer på i rett rekkefølge. For å forklare det helt i detalj:

 

Istedet for å vise alle postene som ligger i databasen vil jeg kun vise siste post fra mine abonnenter, som på twitter :)

Lenke til kommentar

Jeg har altså en tabell med alle brukere, en med alle de jeg abonnerer på og en med alle poster. Men hvordan kan jeg hente postene fra de jeg abonnerer på i fra "all poster tabellen" ? Abonnenter -> alle poster -> postene til abonnentene i rett rekkefølge. Om dere tenker Twitter er det enklere å forstå da? :) At du kan se siste posten utifra de du abonnere på??

Endret av vevo1992
Lenke til kommentar

Slik jeg leser koden din, gjør den følgende:

1. Skaff en liste over alle venner som din bruker abonnerer på, i tilfeldig rekkefølge (egentlig ikke tilfeldig, for det blir den rekkefølgen abonnementene er registrert - men i denne sammenhengen er jo nettopp det å betrakte som tilfeldig).

2. For hver av disse vennene,

2a) Dra ut all informasjon om personens brukerkonto, og

2b) Dra ut alle postene fra den aktuelle personen, i omvendt kronologisk rekkefølge.

 

Jeg ser ikke at du gjør noe som helst med verken brukerinformasjonen eller postene, men det går jeg ut fra at du gjør i kode som du ikke har publisert her.

 

Jeg antar videre at det du ønsker er å vise alle postene i omvendt kronologisk rekkefølge. Du oppgir bare at rekkefølgen du får dem ut i er feil, uten å spesifisere hvilken rekkefølge du faktisk får. Ut fra koden din antar jeg imidlertid at du først får ut alle poster for person 1, internt sortert i riktig rekkefølge - deretter alle poster for person 2, internt sortert i riktig rekkefølge - og så videre. I så fall er grunnen åpenbar hvis man ser nøye på algoritmen du har brukt.

 

Forutsatt at jeg nå har skjønt problemstillingen riktig, blir mitt tips derfor at du i stedet for å splitte opp spørringen din etter hvilke tabeller du spør mot, heller sammenstiller tabellene i en subquery. Prøv noe i denne gata: "select * from poster where post_bruker = (select ____ from abonnenter where bruker='$me') order by id desc", hvor ____ erstattes av feltnavnet for brukeren som det abonneres på i tabellen "abonnenter" (det fremgår ikke hva dette feltnavnet heter). Jeg har ikke tid til å kvalitetssikre spørringen min nå, så den er ikke garantert å være 100% riktig syntaktisk, men det er ideen som er poenget her. Se eventuelt http://dev.mysql.com/doc/refman/5.1/en/subqueries.html for dokumentasjon på subquery-syntaks.

Lenke til kommentar

<?php
$me = $_SESSION['userid'];
$get_w = mysql_query("SELECT * FROM abonnenter WHERE bruker='$me'");
$check_get_frn = mysql_num_rows($get_w);
if (empty($check_get_frn)) {
echo 'Legg til folk for å se poster.';
} else {
$friends = array();
while($get_frn = mysql_fetch_assoc($get_w)) {
$friends[] = $get_frn['venn'];
}
$userQuery = '';
$postQuery = '';
foreach($friends as $a){
if(empty($userQuery)){
$userQuery.= "bruker='$a'";
}
else{
$userQuery.=" OR bruker='$a'";
}
if(empty($postQuery)){
$postQuery.= "post_bruker='$a'";
}
else{
$postQuery.=" OR post_bruker='$a'";
}
}

$select_post = mysql_query("SELECT * FROM poster WHERE ($postQuery) AND ($userQuery) ORDER BY id DESC");
while($show_feed = mysql_fetch_assoc($select_post)){
// ouputen her
// Hvis du må hente brukerinfo, lag spørringen innenfor denne while loopen
}
}
?>

Mener dette skal holde

 

Molty

Endret av molty
Lenke til kommentar

Hei, jeg skal prøve ut kodene og forklaringene dere har tilbakemeldt, takk skal dere ha! Så skal jeg også prøve å beskrive igjen så godt jeg kan. Det gjør ingenting om jeg skal lage databaseoppsett eller skrive kode på nytt, men det eneste jeg ønsker er akkurat slik som på twitter.

Jeg har en tabell med alle registrerte brukere, en tabell som jeg kaller abonnenter slik at når jeg klikke "Abonner" på en person vil det lages en link mellom meg og den personen. Slik: Meg + Venn. Da har jeg begynt å abonnere på han. Han skriver innlegg på sin side og det samme gjør alle andre på sine sider. Det jeg ønsker å lage er at jeg kan klikke på "Siste post fra abonnenter". Da vil jeg at den siste posten som ble skrevet øverst hvor den gamleste posten ligger i bunn, men sortert fra alle mine abonnenter f.eks;

 

4. Ola Nordmann: Heihei

3. alfred97: Tredje post

2. molty: Andre post

1. The Jackal: Første post!

 

Om jeg velger å fjerne Ola Nordmann fra mine abonnenter klikker jeg "Fjern". Da vil alle postene fra Ola Nordmann forsvinne fra postene som er synlig for meg.

Siden kan f.eks. ha 100 brukere men at kun de jeg abonnerer er det postene jeg vil se, siden jeg abonnerer på de.

 

Jeg har en tabell med alle postene som blir skrevet på siden, men jeg vil plukke ut de postene den brukeren har skrevet på sin egen side til

denne abonnent siden hvor jeg kan da se disse postene.

 

Kan noen forklare meg hvordan det går an å sette opo noen slikt? Håper dette er enklere å forstå :) Takk for all deres hjelp!

Endret av vevo1992
Lenke til kommentar

Ser at det dukker opp flere løsninger her, med helt forskjellig vinkling. Når folk forstår problemstillingen på så mange forskjellige måter, er det sannsynligvis et signal om at trådstarter ikke har beskrevet målsetningen sin presist nok. :)

Slik jeg oppfattet det hvertfall har han opprettet en tabell som inneholder abonnering på andre brukere. I den tabellen lagrer han bruker id til personene han abonnerer og henter ut alle ved å kjøre en spørring hvor hans egen id står opplyst.

 

Problemet han slik jeg oppfattet det var at han bare fikk ut en post fra hver bruker, men at de også kom i feil rekkefølge. Dette fordi han tok en while loop på abonnemangene og hadde resten av spørringene der inni, som først og fremst bare gav 1 post og feil rekkefølge.

 

Derfor i min løsning hentet jeg ut alle bruker id som personen abonnerer på og la i en egen array, som senere gjorde om til en variabel som ville brukes i spørringen hans. Ut i fra hvordan spørringen fylte jeg inn slik at det passet inn hvordan den var fra før. Det jeg gjorde så var å skrive ut alle postene slik jeg gjorde, lol..

Men innså nå at jeg har gjort en liten feil som jeg skal rette opp i NO

 

Molty

Lenke til kommentar

Helt 100% korrekt molty! Jeg prøvde koden din, men leser at du har gjort en feil. Jeg fikk denne meldingen:

Warning: mysql_fetch_assoc() expects parameter 1 to be resource, boolean given in /test.php on line 33

 

Jeg måtte jo legge til kobling av database osv, så linjenr. er jo litt forandret. Skal poste hvordan det ser ut hos meg:

 

30 }
31
32 $select_post = mysql_query("SELECT * FROM poster WHERE ($postQuery) AND ($userQuery) ORDER BY id DESC");
33 while($show_feed = mysql_fetch_assoc($select_post)){
34 // ouputen her
35 // Hvis du må hente brukerinfo, lag spørringen innenfor denne while loopen
36 echo $show_feed['post'] . '<br>';
37 }
38 }
39 ?>

Endret av vevo1992
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...