1

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

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

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

我以前没有使用过排序功能,我尝试查看一些示例,但无法真正找到针对我的情况的特定内容。任何和所有的帮助将不胜感激。我已经查看了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 }
        }
?>
4

2 回答 2

1

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

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

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

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

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

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

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

但是,您不想在sort这里使用。您要排序的是一行数据(一位艺术家)的变量,而不是所有艺术家。因此,如果您将每个艺术家行视为一张充满数据(姓名、id#、页面 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。

于 2012-10-25T14:25:36.673 回答
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..)

始终牢记“一个查询胜于多个查询”。不是一个具体的规则,只要有可能,就尝试去做。每个查询都有开销,循环中的查询是一个警告信号。

希望这会有所帮助

于 2012-10-25T14:32:33.407 回答