所以,我一直在尝试为练习项目创建用户的活动页面,该页面显示他们在页面上的所有活动和他们的朋友的活动。我有这个工作,但由于查询是嵌套的,无法按日期排序。问题是我必须首先获得用户的朋友,这是在一个表中,然后我必须收到提及该用户的通知。
查询的最佳方法是什么,以便按日期排序。谢谢你的帮助!
表格的设置模糊如下:用户
id ||名字||姓氏||用户名
B好友
User_id ||朋友ID
C wallpost:
Wallpost_id || from_user_id || to_user_id || wallpost ||约会时间 代码如下:
try {
$DBH = new PDO("mysql:host=$host;dbname=$db_name", $username, $password);
$DBH->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );
} catch(PDOexception $e) {
echo $e->getMessage();
}
try {
$myid = $_SESSION['identification'];
$result = $DBH->prepare("SELECT Friends.*, users.id, users.Firstname,users.Lastname FROM Friends
JOIN users ON Friends.Friends=users.id
WHERE Friends.id=:myid");
$result->execute(array(':myid' => $myid));
$result->setFetchMode(PDO::FETCH_ASSOC);
$r = $result->fetchAll();
echo "<br><br><br>";
echo "<ul>";
try{
$stmt = $DBH->prepare("CREATE TEMPORARY TABLE usering(`user_id` int(10) , `First_Name` varchar(250), `Last_Name` varchar(250), `user_name` varchar(135), `password` varchar(135), `NaCl` varchar(135))");
$stmt->execute();
$stmy = $DBH->prepare("INSERT INTO usering(`user_id`, `First_Name`, `Last_Name`, `user_name`, `password`, `NaCl`) SELECT * from users");
$stmy->execute();
}catch(PDOexception $e) {
echo $e->getMessage();
}
try {
foreach($r as $row){
$FriendId = $row['Friends'];
$result2 = $DBH->prepare("SELECT wallpost.*, usering.*, users.* FROM wallpost
JOIN usering ON wallpost.from_user_id=usering.user_id
JOIN users ON wallpost.to_user_id=users.id
WHERE :FriendId in (from_user_id, to_user_id) ORDER BY wallpost_id DESC
");
$result2->execute(array(':FriendId' => $FriendId));
$result2->setFetchMode(PDO::FETCH_ASSOC);
$r2 = $result2->fetchAll();
foreach($r2 as $row2){
$from_user_id = $row2['from_user_id'];
$fromUsername = $row2['user_name'];
$from_user_name = $row2['First_Name'] . " " . $row2['Last_Name'];
$to_user_name = $row2['Firstname'] . " " . $row2['Lastname'];
$toUsername = $row2['username'];
$to_user_id = $row2['to_user_id'];
$wallpost = $row2['wallpost'];
/*"<div class='miniprofile_right'><img class='microphoto' src='../" . $from_username . "/profile.jpg'><div class='status_text'><a href='../" . $from_username . "/" . $from_user_id . "profile.php'>" . $from_user_firstname . " " . $from_user_lastname . "</a> => ". $firstname . " " . $lastname . ":</br>" . $walldate2 . "<br>" . $wallpost . " - at " . $walltime . "</div></div><br><br>"*/
if($from_user_id == $to_user_id){
echo "<div class='miniprofile_right'><img class='microphoto' src='../members/" . $fromUsername . "/profile.jpg'><div class='status_text'><a href='../members/" . $fromUsername . "/" . $from_user_id . "profile.php'>" . $from_user_name . "</a> posted a status: <br>" . $wallpost . "</div></div></br></br>";
} else {
echo "<div class='miniprofile_right'><img class='microphoto' src='../members/" . $fromUsername . "/profile.jpg'><div class='status_text'><a href='../members/" . $fromUsername . "/" . $from_user_id . "profile.php'>" . $from_user_name . "</a> posted on " . "<a href='../members/" . $toUsername . "/" . $to_user_id . "profile.php'>" . $to_user_name . "'s" . "</a> wall: <br> " . $wallpost . "</div></div></br></br>";
}
}
}
}catch(PDOexception $e) {
echo $e->getMessage();
}
echo "</ul>";
} catch(PDOexception $e) {
echo $e->getMessage();
}
答案 0 :(得分:0)
尝试创建一个类/对象并将条目提供给它。在运行所有查询并且相关数据在您的新类中之后,排序应该是微不足道的。
因此,只要您的查询检索到正确的信息,您就可以在SQL之外对数据进行排序(如果查询过长)
答案 1 :(得分:0)
感谢您的帮助。所以我用一个可怕的黑客(下面)解决了这个问题。我真的很想让这个更有效率,所以我将问题留给任何人提出任何更好的建议。与此同时,我正在调查@Michael Stevens的帖子,看看它是否会奏效。
try{
$stmt = $DBH->prepare("CREATE TEMPORARY TABLE usering(`user_id` int(10) , `First_Name` varchar(250), `Last_Name` varchar(250), `user_name` varchar(135), `password` varchar(135), `NaCl` varchar(135))");
$stmt->execute();
$stmy = $DBH->prepare("INSERT INTO usering(`user_id`, `First_Name`, `Last_Name`, `user_name`, `password`, `NaCl`) SELECT * from users");
$stmy->execute();
}catch(PDOexception $e) {
echo $e->getMessage();
}
try {
$FriendId = $row['Friends'];
$result2 = $DBH->prepare("SELECT wallpost.*, usering.*, users.* FROM wallpost
JOIN usering ON wallpost.from_user_id=usering.user_id
JOIN users ON wallpost.to_user_id=users.id
ORDER BY WallDateTime DESC
");
$result2->execute();
$result2->setFetchMode(PDO::FETCH_ASSOC);
$r2 = $result2->fetchAll();
foreach($r2 as $row2){
$from_user_id = $row2['from_user_id'];
$fromUsername = $row2['user_name'];
$from_user_name = $row2['First_Name'] . " " . $row2['Last_Name'];
$to_user_name = $row2['Firstname'] . " " . $row2['Lastname'];
$toUsername = $row2['username'];
$to_user_id = $row2['to_user_id'];
$wallpost = $row2['wallpost'];
$DateTime = $row2['WallDateTime'];
$same = "";
try {
$result = $DBH->prepare("SELECT * FROM Friends WHERE Friends.id=:myid");
$result->execute(array(':myid' => $myid));
$result->setFetchMode(PDO::FETCH_ASSOC);
$r = $result->fetchAll();
foreach($r as $row){
$FriendId = $row['Friends'];
//echo $FriendId . " " . $from_user_id . " " . $to_user_id . " " . $wallpost . "<br>";
//echo "Friend Id is: " . $FriendId . "and to user id is " . $to_user_name . $to_user_id . " whilst from user id name is " . $from_user_name . $from_user_id . "<br>";
if($from_user_id == $to_user_id){
$string ="<div class='miniprofile_right'><img class='microphoto' src='../members/" . $fromUsername . "/profile.jpg'><div class='status_text'><a href='../members/" . $fromUsername . "/" . $from_user_id . "profile.php'>" . $from_user_name . "</a> posted a status: <br>" . $wallpost . "<br>" . $DateTime . "</div></div></br></br>";
if($same != $string){
echo $string;
$same = $string;
}
} elseif($from_user_id == $FriendId){
$string = "<div class='miniprofile_right'><img class='microphoto' src='../members/" . $fromUsername . "/profile.jpg'><div class='status_text'><a href='../members/" . $fromUsername . "/" . $from_user_id . "profile.php'>" . $from_user_name . "</a> posted on " . "<a href='../members/" . $toUsername . "/" . $to_user_id . "profile.php'>" . $to_user_name . "'s" . "</a> wall: <br> " . $wallpost . "<br>" . $DateTime . "</div></div></br></br>";
if($same != $string){
echo $string;
$same = $string;
}
} elseif($to_user_id == $FriendId){
$string = "<div class='miniprofile_right'><img class='microphoto' src='../members/" . $fromUsername . "/profile.jpg'><div class='status_text'><a href='../members/" . $fromUsername . "/" . $from_user_id . "profile.php'>" . $from_user_name . "</a> posted on " . "<a href='../members/" . $toUsername . "/" . $to_user_id . "profile.php'>" . $to_user_name . "'s" . "</a> wall: <br> " . $wallpost . "<br>" . $DateTime . "</div></div></br></br>";
if($same != $string){
echo $string;
$same = $string;
}
} else {
}
}
}catch(PDOexception $e) {
echo $e->getMessage();
}