webForumDet fria alternativet

Sortera på datumet?

PHPur PHP

15 svar · 918 visningar · startad av streetrobban

Medlem sedan jan. 20011 140 inlägg
Frågan#1

Hej!

Jag håller på med ett forum där jag listar de senast skrivna trådarna i forumet. Nu är det så att jag vill sortera på ett annat sätt, på datumet då svaren är skrivna. Just nu hämtar jag trådarna från tabellen Forum och länkar den tillsammans med användarna från Users. Men jag antar att jag även måste länka in tid/datum från tabellen med svaren (Replys)?

Någon som har några tips på hur detta ska göras? Har provat med den här koden, men den vill inte skriva ut något.

$get = mysql_query("SELECT
fo.*,
us.Username AS Username, us.ID AS UserID,
re.TimeAdded AS ReTimeAdded, re.DateAdded AS ReDateAdded
FROM Users us
INNER JOIN Forum fo ON fo.UserID = 'us.ID'
LEFT JOIN ForumReplys re ON us.ID = 're.UserID'
WHERE fo.CategoryID = '$CategoryID'
ORDER BY re.DateAdded DESC, re.TimeAdded DESC");
while($row = mysql_fetch_array($get))
Medlem sedan juli 20033 147 inlägg
#2

Vad händer om du sorterar efter ReDateAdded?

Medlem sedan jan. 20011 140 inlägg
#3

Fortfarande ingenting...

Medlem sedan apr. 2008137 inlägg
#4

Länkas verkligen reply tabellen med userid? Borde rimligtvis vara länkat till primärnyckeln i forum? Kan du visa hur datastrukturen ser ut så blir det lättare att förstå.
Sen borde du rimligtvis ha forum som primär tabell och joina med users och inte tvärt om. Det spelar inte så stor roll på mindre siter, men det kan orsaka prestandaproblem när datamängden ökar.

Medlem sedan mars 20007 896 inlägg
#5

Ta bort enkel-fnuttarna runt us.ID och re.UserID i dina JOINs?

Medlem sedan jan. 20011 140 inlägg
#6

SPiN: Nice det funkade, fast nu skriver den ut posterna x så många kommentarer det finns :)

Medlem sedan mars 20034 471 inlägg
#7

streetrobban skrev:

SPiN: Nice det funkade, fast nu skriver den ut posterna x så många kommentarer det finns :)

Det här får du lösa i while-slingan.

$get = mysql_query("SELECT ...");
$oldID = -1; 
while($row = mysql_fetch_array($get)) {
    if ($oldID != $row["<inläggets/postens ID-nr>"]) {
       //Skriv ut posten
       $oldID = $row["<inläggets/postens ID-nr>"];
    }
   //Skriv ut kommentaren
}
Medlem sedan jan. 20011 140 inlägg
#8

Hmm jag får det fortfarande inte att funka. Gör jag någo fel?

// Visa samtliga inlägg
$get = mysql_query("SELECT
fo.*,
us.Username AS Username, us.ID AS UserID,
re.TimeAdded AS ReTimeAdded, re.DateAdded AS ReDateAdded
FROM Users us
INNER JOIN Forum fo ON fo.UserID = us.ID
LEFT JOIN ForumReplys re ON us.ID = re.UserID
WHERE fo.CategoryID = '$CategoryID'
ORDER BY re.DateAdded DESC, re.TimeAdded DESC");
$oldID = -1;
while($row = mysql_fetch_array($get)) 
{
$ID = $row['ID'];
$TimeAdded = $row['TimeAdded'];
$DateAdded = $row['DateAdded'];
$Subject = $row['Subject'];
$Message = $row['Message'];
$CategoryID = $row['CategoryID'];
$Views = $row['Views'];

$Username = $row['Username'];
$UserID = $row['UserID'];

if ($oldID != $row["ID"])
{
// Hämta svaren
$get2 = mysql_query("SELECT * FROM ForumReplys WHERE ThreadID = '$ID'");
$rowCount = mysql_num_rows($get2);

// SKRIV UT ALLA POSTER

$oldID = $row["ID"];
}
}
Medlem sedan mars 20007 896 inlägg
#9

Återigen har du enkel-fnuttar kring dina värden som du ska jämföra i SQL-frågan. ID-fälten är av heltalstyp, därför ska du inte omsluta dom med ' - då blir det en strängjämförelse mot ett heltal, vilket inte fungerar.

SELECT
fo.*,
us.Username AS Username, us.ID AS UserID,
re.TimeAdded AS ReTimeAdded, re.DateAdded AS ReDateAdded
FROM Users us
INNER JOIN Forum fo ON fo.UserID = us.ID
LEFT JOIN ForumReplys re ON us.ID = re.UserID
WHERE fo.CategoryID = $CategoryID
ORDER BY re.DateAdded DESC, re.TimeAdded DESC
SELECT * FROM ForumReplys WHERE ThreadID = $ID
Medlem sedan jan. 20011 140 inlägg
#10

Okej, trodde du menade på JOIN:sen bara. Ska kolla sen, tack för svar :)

Medlem sedan jan. 20011 140 inlägg
#11

Testade att ta bort enkelfnuttarna, men trådarna skrivs fortfarande ut flera gånger än de ska. Typ 3-4 gånger styck...

Medlem sedan jan. 20011 140 inlägg
#12

Om jag använder "GROUP BY ID" så får jag ut rätt mängd trådar. Men trådarna sorteras fortfarande inte efter det senaste svarets datum/tid.

Medlem sedan apr. 2008137 inlägg
#13

ORDER BY MAX(re.DateAdded) kanske?

Medlem sedan jan. 20011 140 inlägg
#14

Nej det funkar inte. Vad gör MAX?

Medlem sedan apr. 2008137 inlägg
#15

Precis som det låter, plockar ut maximalt värde av ett fält i en grupp. Du kanske behöver ange det redan i select för att kunna sortera på det, inte helt säker.
Väldigt svårt att ge några svar utan att se hur datastrukturen ser ut.

Skulle också rekommendera att slå ihop TimeAdded och DateAdded till en gemensam DATETIME eller TIMESTAMP, det borde underlätta vid datum och tidssortering.

Medlem sedan jan. 20011 140 inlägg
#16

Hmm, det har aldrig varit några problem att sortera på datumet tidigare. Jag tycker att SQL-satsen borde funka rent logiskt. Men jag kanske hämtar från tabellerna i fel ordning?

139 ms totalt · 3 externa anrop · v20260731065814-full.25f56b17
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
137 ms — hämta tråd, inlägg och bilagor (db)