1

このコードは、あるテーブルから ID の特定のリストを取得し、それらの ID を使用して別のテーブルから情報を取得するために使用されます。2 番目のテーブルからすべての情報を取得したら、2 番目のテーブルのフィールドに基づいてデータをアルファベット順に並べ替えようとしています。

たとえば、相関 ID に基づいて名前を取得し、結果全体を名前 (artist_name) のアルファベット順に表示したいと考えています。

これが私が持っているコードです。なしでこれを実行すると、正常sort()に動作しますが、アルファベット順ではありません。2 番目の 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 }
        }
?>
4

2 に答える 2

1

コメンターが言及したように、あなたの最善の策はORDER BY、SQLで句を使用することです。

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

PDOまたはmysqliの使用を提案した他のコメンターも正しいですが、それは別の問題です。

マニュアルによると、並べ替えに関する特定の質問に答えるには、

Blockquote 注: この関数は、配列内の要素に新しいキーを割り当てます。キーを並べ替えるだけでなく、割り当てられている可能性のある既存のキーを削除します。

これは、すべての配列キー (「page_slug」、「artist_name」など) が消去されることを意味します。そのため、後でそれらを参照しようとすると、そこにはデータがありません。

この方法を使用する場合は、asortを使用して連想配列を並べ替えます。

ただし、ここでは使用しませんsort。並べ替えているのは、すべてのアーティストではなく、1 行のデータ (1 人の個々のアーティスト) の変数です。したがって、各アーティスト行をデータ (名前、ID 番号、ページ スラッグなど) でいっぱいのインデックス カードと考えると、カード上でそれらのアイテムを移動するだけです。カードカタログを再編成しているわけではありません。

SQL ステートメントで句を使用するorder by(および PDO で書き換える) のが最善の策です。

これが私がそれを書き直す方法です。データベース構造と具体的に何を達成しようとしているのかについて 100% 確信があるわけではないため、SQL を推測する必要がありますが、これでうまくいくと思います。

$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_linkPDO のfetchObjectメソッドを使用してアーティストをインスタンス化する可能性がありますが、ここでは先を行っています。

今のところ、手続き型コードに固執しています。通常、HTML と PHP を混在させるのは好きではないので、すべてを戻り文字列に割り当て、最後にエコーアウトします。しかし、これはあなたが持っていたものに近く、1 つの SQL クエリ (PDO で - 新しいコードを作成している場合は真剣に使用する価値があります) を使用すると、名前でソートされたアーティストのリストとそれに関連付けられた page_slugs が得られます。

于 2012-10-25T14:25:36.673 に答える
0

これらすべてを 1 つのクエリで実行できます。

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..)

「多くのクエリよりも 1 つのクエリの方が優れている」ことを常に心に留めておくことをお勧めします。具体的なルールはありませんが、できることならやってみてください。各クエリにはオーバーヘッドがあり、ループ内のクエリは警告サインです。

うまくいけば、それは役に立ちます

于 2012-10-25T14:32:33.407 に答える