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))
MeleaMedlem sedan juli 20033 147 inlägg Vad händer om du sorterar efter ReDateAdded?
effataMedlem sedan apr. 2008137 inlägg 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.
SPiNMedlem sedan mars 20007 896 inlägg Ta bort enkel-fnuttarna runt us.ID och re.UserID i dina JOINs?
SPiN: Nice det funkade, fast nu skriver den ut posterna x så många kommentarer det finns :)
aasahMedlem sedan mars 20034 471 inlägg
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
}
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"];
}
}
SPiNMedlem sedan mars 20007 896 inlägg Å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
Okej, trodde du menade på JOIN:sen bara. Ska kolla sen, tack för svar :)
Testade att ta bort enkelfnuttarna, men trådarna skrivs fortfarande ut flera gånger än de ska. Typ 3-4 gånger styck...
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.
effataMedlem sedan apr. 2008137 inlägg ORDER BY MAX(re.DateAdded) kanske?
Nej det funkar inte. Vad gör MAX?
effataMedlem sedan apr. 2008137 inlägg 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.
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?