【问题标题】:Database sorted by a specific string then random数据库按特定字符串排序,然后随机
【发布时间】:2019-11-13 05:50:46
【问题描述】:

有没有办法通过存储在函数中的特定名称对数据库进行排序,然后是随机的? 例如,如果$name = 'Hasan' 那么我希望查询首先选择Hasan 行,然后随机选择其他行

<?php 

/* DATA BASE
id          |  Name
--------------+--------------------------------
'1'         |  Hasan
'2'         |  Ahmad   
'3'         |  Majid 
'4'         |  Hazem  
*/

if(isset($_GET['name'])) {
$name = $_GET['name'];
}
else {
$name = 0;
}

$query = mysqli_query($con, "SELECT * FROM database ORDER BY $name, rand()");
?>

【问题讨论】:

    标签: php sorting mysqli datatables sql-order-by


    【解决方案1】:

    您可以对ORDER BY 子句中的名称进行测试,按是否匹配进行排序。您应该使用准备好的语句来保护自己免受 SQL 注入。例如:

    $stmt = $con->prepare('SELECT * FROM database ORDER BY Name = ? DESC, rand()');
    $stmt->bind_param('s', $_GET['name']);
    $stmt->execute();
    $result = $stmt->get_result();
    while ($row = $result->fetch_assoc()) {
        // ... do something
    }
    

    这是因为 MySQL 在数字上下文中将布尔表达式视为 0 (false) 或 1 (true),因此当名称匹配时 Name = $name 的值将为 1,否则为 0,然后您可以按降序排序.

    请注意,mysqli_stmt::get_result 仅在安装了 mysqlnd 本机驱动程序后可用。否则,您将需要使用mysqli_stmt::bind_resultmysqli_stmt::store_resultmysqli_stmt::fetch 来获取您的数据。

    【讨论】:

      【解决方案2】:

      您应该在这里使用准备好的语句,类似于以下内容:

      SELECT *
      FROM database
      ORDER BY name != ?;
      

      假设您将 Hasan 绑定到 ? 占位符,这将给出:

      SELECT *
      FROM database
      ORDER BY name != 'Hasan';
      

      这会将所有 Hasan 记录放在首位(因为 false 评估为 0),然后所有非 Hasan 记录出现。请注意,您的第二个排序级别 RAND() 甚至可能不是必需的,因为 MySQL 不保证任何进一步的默认排序顺序。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-12-20
        • 1970-01-01
        • 1970-01-01
        • 2013-03-31
        • 1970-01-01
        • 1970-01-01
        • 2021-11-28
        • 1970-01-01
        相关资源
        最近更新 更多