webForumDet fria alternativet

Hämta från två tabeller!

Databaser & SQL

12 svar · 692 visningar · startad av streetrobban

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

Hejsan,

Min kod fungerar inte riktigt. Det finns totalt tre svar på inlägget som gjorts. Men bara två av dom visas. Om jag väljer RIGHT JOIN istället för LEFT JOIN så verkar den förstå att det finns tre svar, men hämtar inte uppgifterna från re (ForumReplys). Men den skriver ut det tredje svaret ändå.

// Visa inlägget
$get2 = mysql_query("SELECT re.*, us.Username AS Username, us.ID AS UserID, us.Picture FROM Users us
LEFT JOIN ForumReplys AS re ON re.UserID = us.ID
WHERE re.ThreadID = '$ThreadID'
ORDER BY DateAdded DESC, TimeAdded DESC");
while($row = mysql_fetch_array($get2)) 
{
$ID = $row['ID'];
$TimeAdded = $row['TimeAdded'];
$DateAdded = $row['DateAdded'];
$Reply = $row['Reply'];
$CategoryID = $row['CategoryID'];
$Picture = $row['Picture'];

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

echo "<!-- ##### TABLE FORUM ##### -->";
echo "<table border=\"0\" style=\"width: 459; background-color: #e7e7e7\" cellspacing=\"0\" cellpadding=\"0\" class=\"forumThread\">";
echo "<tr>";
echo "<td style=\"width: 40; height: 35; background-color: #f0f0c8\">";
echo "<img src=\"images/forum_svar.gif\">";
echo "</td>";
echo "<td style=\"width: 45; height: 35; background-color: #f0f0c8\">";
echo "<img src=\"images/users/$Picture\" width=\"35\" height=\"35\">";
echo "</td>";						
echo "<td style=\"width: 274; height: 35; background-color: #f0f0c8\">";
echo "<b>$Subject</b><br/>";
echo "av $Username";
echo "</td>";
echo "<td style=\"width: 100; height: 35; background-color: #f0f0c8\" align=\"center\">";
echo "$DateAdded $TimeAdded";
echo "</td>";
echo "</tr>";
echo "<tr>";
echo "<td style=\"width: 459; padding: 9; background-image:url(images/bg_forum.gif)\" colspan=\"4\">";
echo "".nl2br($Reply)."";
echo "</td>";
echo "</tr>";
echo "</table><br/><br/>";
echo "<!-- ##### END TABLE FORUM ##### -->";
}
Medlem sedan dec. 200012 464 inlägg
#2
SELECT re.*, 
           us.Username AS Username, 
           us.ID AS UserID, 
           us.Picture 
  FROM Users us
  LEFT JOIN ForumReplys AS re ON re.UserID = us.ID
    and re.ThreadID = $ThreadID
  ORDER BY DateAdded DESC, 
            TimeAdded DESC
Medlem sedan jan. 20011 140 inlägg
#3

Wow tack för ditt snabba svar :)

Nu funkar det nästan. $TimeAdded, $DateAdded och $Reply skrivs dock inte ut. Men användaren (re.Username, re.Picture) hittas.

Medlem sedan dec. 200012 464 inlägg
#4

Det var för snabbt. Kan du ge exempel på datainnehåll i dina tabeller och förväntat resultat?

Medlem sedan jan. 20011 140 inlägg
#5

ForumReplys:
TimeAdded (Text)
DateAdded (Date)
UserID (Int(255))
CategoryID (Int(255))
ThreadID (Int(255))
Reply (Text)

Users:
ID (Int(255))
Username (Text)
Picture (Text)

Jag vill helt enkelt skriva ut svar på en tråd i ett forum. Användarnamn (Username), ID (ID) och bild (Picture) ska hämtas från Users. Och kopplas ihop med svaret (Reply), tid (TimeAdded) och datum (DateAdded) från ForumReplys.

Det finns tre svar på en tråd, de två första skrivs ut korrekt. Men den tredje skrivs bara ut med bild och användarnamn. Alltså saknas svaret, tid och datum på när svaret skrevs (från ForumReplys).

Medlem sedan jan. 20011 140 inlägg
#6

Det verkar som den hämtar information från antingen ForumReplys tabellen eller från Users tabellen beroende på om jag skriver LEFT JOIN eller RIGHT JOIN. Vad ska man skriva för att information ska hämtas från båda tabellerna? :)

RIGHT JOIN så hämtar den från ForumReplys.
LEFT JOIN så hämtar den från Users.

Medlem sedan dec. 20025 483 inlägg
#7
SELECT re.*, 
           us.Username AS Username, 
           us.ID AS UserID, 
           us.Picture 
FROM
  ForumReplys AS re INNER JOIN Users us ON re.UserID = us.ID
    and re.ThreadID = $ThreadID
  ORDER BY DateAdded DESC, 
            TimeAdded DESC
Medlem sedan jan. 20011 140 inlägg
#8

Hmm, när jag kör INNER JOIN så visas inga svar alls.

Medlem sedan jan. 20011 140 inlägg
#9

Med RIGHT JOIN så visas två av tre med allt från Users och ForumReplys. Den tredje visas bara med info från Users, inte ForumReplys.

Medlem sedan dec. 20025 483 inlägg
#10

Finns det ForumReplies som inte har några användare? Då

SELECT re.*, 
           us.Username AS Username, 
           us.ID AS UserID, 
           us.Picture 
FROM
  ForumReplys AS re LEFT JOIN Users us ON re.UserID = us.ID
    WHERE re.ThreadID = $ThreadID
  ORDER BY DateAdded DESC, 
            TimeAdded DESC
Medlem sedan jan. 20011 140 inlägg
#11

Nej alla ForumReplys är har ett nummer i UserID som är kopplat till en användares ID som finns.

Din kod visar alla tre inlägg, det sista utan uppgifter från Users dock...

Medlem sedan dec. 20025 483 inlägg
#12

Då bör INNER JOIN-varianten fungera. Kanske finns det ingen ForumReply som uppfyller re.ThreadID = $ThreadID?

Medlem sedan jan. 20011 140 inlägg
#13

Du hade rätt Peter S. Jag var helt säker på att UserID mostsvarade ID i Users. Men det var en användare som hade fel ID :)

Tack för hjälpen båda två! Jag vet inte vilken tråd jag ska acceptera som svar :)

275 ms totalt · 4 externa anrop · v20260731065814-full.a51de22e
118 ms — deklarationer (db)
0 ms — hämta statistik (cache)
130 ms — hämta tråd, inlägg och bilagor (db)
142 ms — ändringar (db)