繁体   English   中英

对 mysql 查询的结果进行排序

[英]Sorting the results of a mysql query

我很难找到一个优雅的解决方案来根据分隔字符串对 mysql 查询的结果进行排序。 我将在下面更详细地解释

我正在创建一个联系人数据库,个人用户可以在其中添加/删除列表中的人员。 当用户添加新联系人时,我 append 将添加的联系人 ID 添加到分隔字符串中,并将该数据存储在与该用户关联的数据库列中(命名联系人):

$userID = ?? //YOUR ID
$contactID = ?? //WHATEVER THE ADDED USER ID IS
$confirm = 0 //has the user been confirmed
$sql = "SELECT contacts FROM user WHERE id = '$userID'";
$query = mysql_query($sql);
$row = mysql_fetch_array($query);
$contact = $row['contacts']; 
$contact .= '|'.$contactID.':'.$confirm;
$update = mysql_query("UPDATE user SET contacts = '$contact' WHERE id = '$userID'");

//contact column data might be:  |10:0|18:0|36:0|5:0

当用户搜索他们的联系人时,我从联系人列中获取数据,分解/拆分字符串并返回各个用户名:

$userID = ?? //YOUR ID
$sql = "SELECT contacts FROM user WHERE id = '$userID'";
$query = mysql_query($sql);
$row = mysql_fetch_array($query);
$contacts = explode("|", $row['contacts']);
foreach($contacts as $item)
{
 list($contactID,$confirm) = split(":", $item);
 $sql = "SELECT name FROM ".user." WHERE id = '$contactID'";  
 $query = mysql_query($sql);
 $row = mysql_fetch_array($query);
 echo($row['name'].'<BR>');
}

这确实会返回所有名称,但它会按照分隔字符串的顺序返回它们。 我似乎找不到一种优雅的方式来按字母顺序对名称进行排序。

我不应该将联系人列表存储在带分隔符的字符串中吗? 你会如何解决这个问题?

没错,您不应该将联系人存储在字符串中。 而是使用另一个包含用户信息的表。 新表应如下所示:

Table: user_contacts
| user_id    |    contact_id    | confirm |
-------------------------------------------
|  your data here...                      |

然后,当您需要联系人列表时,您可以简单地执行另一个查询:

SELECT * FROM `user_contacts`
JOIN `users` ON `users`.`id` = `user_contatcs`.`user_id`
WHERE `users`.`id` = $id
ORDER BY `users`.`name`;

或者您需要订购。

有两种明显的方法:

  1. 获取结果后对结果进行排序
  2. 在一个查询中获取它们并让数据库对它们进行排序

对于 #1,使用usort()

$rows = array();
foreach ($contacts as $item){
    list($contactID,$confirm) = split(":", $item);
    $query = mysql_query("SELECT name FROM user WHERE id = '$contactID'");
    $rows[] = mysql_fetch_array($query);
}
usort($rows, 'sort_by_name');

function sort_by_name($a, $b){
    return strcmp($a['name'], $b['name']);
}

foreach ($rows as $row){
    echo($row['name'].'<BR>');
}

对于 #2,构建 ID 列表并使用IN

$ids = array();
foreach ($contacts as $item){
    list($contactID,$confirm) = split(":", $item);
    $ids[] = $contactID;
}
$ids = implode(',', $ids);
$query = mysql_query("SELECT name FROM user WHERE id IN ($ids) ORDER BY name ASC");
while ($row = mysql_fetch_array($query)){

    echo($row['name'].'<BR>');
}

如果您使用的是关系数据库,那么您需要的是一个单独的表来存储人与联系人的关系。 然后,您将根据跨两个表的联接将 sql 查询修改为 select

SELECT * FROM person, contact
JOIN contact ON person.id = contact.personid
JOIN person ON contact.contactid = person.id
WHERE person.id = $id
ORDER BY person.lastname 

(该代码可能不太正确。)

如果您使用的是非 sql 类型的实现,那么您这样做的方式很好,除了您必须在事后以编程方式排序或插入时排序。 插入时排序意味着您必须在插入联系人时查询当前联系人列表,然后进行排序以找到正确的 position 并将 id 插入到分隔字符串中。 然后将其保存回数据库。 这样做的缺点是您只能以一种方式排序。

通常,人们使用关系数据库并如上所述“规范化”它们。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM