【问题标题】:PHP ORDER BY not working nested queryPHP ORDER BY 不工作嵌套查询
【发布时间】:2013-10-26 20:34:06
【问题描述】:

所以,我一直在尝试为一个练习项目创建一个用户活动页面,该页面在一个页面上显示他们的所有活动和他们朋友的活动。我已经完成了这项工作,但由于查询被嵌套,无法按日期排序。问题是我必须首先获取用户的朋友,它在一个表中,然后我必须获取提及该用户的通知。

进行查询以便按日期排序的最佳方式是什么?感谢您的帮助!

表格是这样设置的:

一个用户

标识 ||名字 ||姓氏 ||用户名

B 朋友

用户ID ||好友编号

C 墙贴:

Wallpost_id || from_user_id || to_user_id ||墙贴||约会时间 代码如下:

 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();
}

【问题讨论】:

  • 有什么理由不只是加入wallpost表并按顺序使用它吗?
  • 好主意,但我认为它不会按日期排序,因为连接必须在 from_user_id 和 to_user_id 上

标签: php mysql join


【解决方案1】:

尝试创建一个类/对象并将条目输入其中。在运行所有查询并且相关数据在您的新类中之后,排序应该很简单。

因此,只要您的查询检索到正确的信息,如果查询过长,您就可以在 SQL 之外对数据进行排序

【讨论】:

  • 什么?为什么? DBMS 就是为此而存在的
  • 更轻松,更多控制。我想您可以通过更多方式更轻松地操作数据,然后您可以使用纯 SQL。
  • 我通常不是 OOP 的粉丝 - 你在想象什么样的事情?
  • 我最近不得不使用drupal 颤抖。客户想要一种非常具体的方式来订购待发货订单。它的排序方式有多种规则,因此通过创建一个对象,我可以用每个挂单中的每个产品填充它。每种产品都有不同的属性可供排序。这个想法是让类按多个因素排序,然后以排序的方式返回顺序列表。
【解决方案2】:

感谢您的帮助。所以我用一个可怕的黑客解决了这个问题(下)。我真的很想提高效率,所以我将这个问题留给任何人提出更好的建议。与此同时,我正在查看@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();
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-19
    • 2016-11-30
    • 2020-01-05
    • 1970-01-01
    相关资源
    最近更新 更多