此代码用于从一个表中获取特定的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 }
}
?>
答案 0 :(得分:1)
正如评论者所提到的,最好的办法是在SQL中使用ORDER BY
子句。
SELECT *
FROM artist_tbl
WHERE artist_id = XXX
ORDER BY artist_name ASC
建议使用PDO或mysqli的其他评论者也是正确的,但这是一个不同的问题。
根据手册,回答有关排序的具体问题
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..)
始终要记住“一个查询比许多查询更好”。不是一个具体的规则,只要它可以做,尝试这样做。每个查询都有开销,循环查询是一个警告标志。
希望有帮助