使用php从mysql查询中排序数据时遇到困难

时间:2012-10-25 14:13:52

标签: php mysql sorting

此代码用于从一个表中获取特定的ID列表,然后使用这些ID从另一个表中获取信息。一旦我从第二个表中获取了所有信息,我就会尝试根据第二个表中的字段按字母顺序对数据进行排序。

示例,我根据相关ID获取名称,然后按名称(artist_name)按字母顺序显示整个结果。

这是我的代码。当我在没有sort()的情况下执行此操作时,它工作正常但不按字母顺序排列。当我在第二个while语句中添加sort()时,页面看起来相同,但不显示名称和其他数据。浏览器中的源代码显示结果正在计算中,但排序必须防止因某些原因显示变量或信息。

之前我没有使用过排序函数,我尝试查看一些示例,但无法找到特定于我的情况的东西。任何和所有的帮助将不胜感激。我已经查看了 PHP手册进行排序,因此无需向我发送链接; - )

<?php $counter = 0;
    $artistInfo = mysql_query("SELECT DISTINCT event_url_tbl.artist_id FROM event_url_tbl WHERE (SELECT cat_id FROM artist_tbl WHERE artist_tbl.artist_id = event_url_tbl.artist_id) = 1");
    while ($aID = mysql_fetch_array($artistInfo))
        {
            $getArtistInfo = mysql_query("SELECT * FROM artist_tbl WHERE artist_id = '" . $aID['artist_id'] . "'");
            while($artist = mysql_fetch_array($getArtistInfo))
                { 
                    sort($artist);?>
                    <a class="navlink" href="<?=HOST?><?=$artist['page_slug']?>/index.html">
                        <?=$artist['artist_name']?>
                    </a><br />
                <?php }
        }
?>

2 个答案:

答案 0 :(得分:1)

正如评论者所提到的,最好的办法是在SQL中使用ORDER BY子句。

SELECT * 
FROM artist_tbl 
WHERE artist_id = XXX 
ORDER BY artist_name ASC

建议使用PDOmysqli的其他评论者也是正确的,但这是一个不同的问题。

根据手册,回答有关排序的具体问题

  

Blockquote注意:此函数为数组中的元素分配新键。它将删除可能已分配的任何现有密钥,而不仅仅是重新排序密钥。

这意味着您的所有数组键('page_slug','artist_name'等)都将被清除。因此,当您稍后尝试引用它们时,那​​里没有数据。

如果您使用此方法,您可能希望使用asort对关联数组进行排序。

但是,您不想在此处使用sort。您要排序的是一行数据(一个艺术家)的变量,而不是所有艺术家的变量。因此,如果您将每个艺术家行视为一个充满数据的索引卡(name,id#,page slug等),那么您所做的就是在卡片上移动这些项目。你没有重新组织你的卡片目录。

在SQL语句中使用order by子句(并在PDO中重写)是最好的选择。

以下是我将如何重写它。我必须对SQL做一些猜测,因为我不是100%确定你的数据库结构以及你特别想要完成的事情,但我认为这样可行。

$query_str = "
    SELECT 
        artist.name,
        artist.page_slug
    FROM 
        artist_tbl AS artist
        INNER JOIN event_tbl AS event
            ON event.artist_id = artist.artist_id
    WHERE
        artist.cat_id = 1
    ORDER BY
        artist.name ASC";
$db_obj = new PDO (/*Connection stuff*/);
$artists_sql = $db_obj->prepare ($query_str);
$artists_sql->execute ();
while ($artist = $artists_sql->fetch (PDO::FETCH_ASSOC)) {
    $return_str .= "<a class='navlink' href='{HOST}
                {$artist['page_slug']}/index.html'>
                {$artist['artist_name']}</a><br/>";
    }
echo $return_str;

老实说,我可能会创建一个带有display_link方法的艺术家类,并使用PDO的fetchObject方法来实例化艺术家,但这已经超越了我们自己。

现在我坚持使用程序代码。我通常不喜欢混合我的HTML和PHP,因此我将所有内容分配给返回字符串并在最后回显它。但这与您所拥有的一样,使用一个SQL查询(在PDO中 - 如果您正在创建新代码,非常值得开始使用),它应该为您提供按名称及其关联的page_slugs排序的艺术家列表。

答案 1 :(得分:0)

您可以在一个查询中完成所有这些操作:

SELECT * FROM event_url_tbl AS event
INNER JOIN artist_tbl AS artist ON event.artist_id = artist.id
ORDER BY artist.name DESC;

这会减少脚本中的许多复杂性/前景。你最终会得到

Label1 (Label 1 details..) Artist1 (Artist1 details..)
Label1 (Label 1 details..) Artist2 (Artist1 details..)
Label2 (Label 2 details..) Artist3 (Artist1 details..)

始终要记住“一个查询比许多查询更好”。不是一个具体的规则,只要它可以做,尝试这样做。每个查询都有开销,循环查询是一个警告标志。

希望有帮助