3

これまで、php で 1 対 1 の関係しか扱っていませんでしたが、1 対多の関係に関する問題に行き詰まっています。私はこれに数日間座っていましたが運が悪かったので、気が狂う前に誰かが介入して解決策を示してくれることを切望しています.

私のデータベースには一連の URL があり、さまざまなテーブルから、他のさまざまなフィールドとともに SELECT クエリによって受信されます。すべての URL には少なくとも 1 つのカテゴリが関連付けられていますが、複数のカテゴリを持つことができます。したがって、私の結果では、次のように見えるかもしれません。

link_id = 3   url= 'http://www.somesite1.com'   category = 'uncategorised'
link_id = 4   url= 'http://www.somesite2.com'   category = 'travel'
link_id = 4   url= 'http://www.somesite2.com'   category = 'fun'
link_id = 4   url= 'http://www.somesite2.com'   category = 'misc'
link_id = 3   url= 'http://www.somesite3.com'   category = 'uncategorised'

私はこれを機能させました。while ループと mysql fetch 配列を使用して、ループして出力すると、結果は上記とまったく同じように見えます。それは素晴らしいですが、私が必要とするのは、次のようなものを読むことです:

link_id = 4   url = 'http://www.somesite2.com'   category = 'travel fun misc'

そのため、基本的に各 URL のすべてのカテゴリが何らかの方法で結合され、出力されます。私の最初の試みで、入れ子になった while ループを試すようになりましたが、うまくいきませんでした。これが実現可能かどうかはわかりません。それとは別に、多次元配列が必要かどうか疑問に思っています(完全な推測ですが、これまで使用する必要はありませんでした)。

上記のように、これらの結果をリンク ID で並べ替えているので、現在のループ反復のリンク ID が最後の反復のリンク ID と一致するかどうかがわかります。その場合、複数のカテゴリを持つものがあります。とても近いのですが、よくわかりません。

何か案は?

4

4 に答える 4

3

mysql には「GROUP_CONCAT」関数もあります。それはまさにあなたが達成したいことをするはずです。

何かのようなもの :

SELECT url, GROUP_CONCAT(category) AS categories FROM yourtable GROUP BY url 
于 2009-02-12T14:51:39.490 に答える
0

接続テーブルを使用する必要があります。

まず、リンクのテーブルがあります

id = 1 url = something
id = 2 url = something else

次に、カテゴリのテーブルがあります

id = 1 category = something
id = 2 category = something else

次に、接続テーブルがあります

url_id = 1 category_id = 1
url_id = 1 category_id = 2
url_id = 2 category_id = 1

これで少なくとも始められるはずです。

于 2009-02-12T14:33:42.763 に答える
0

コントロール ブレーク アルゴリズムを使用する必要があります。

set last_link variable to null
set combined_category to null
exec query

loop over result set {
    if last_link == null {
        last_link=fetch_link
    }
    if fetch_link==last_link {
        set combined_category+=ltrim(' '.fetch_category)
    } else {
        display html for last_link and combined_category
        set last_link=fetch_link
        set combined_category=fetch_category
    }
}//loop

display html for last_link and combined_category

「display html」を一般的な「作業」イベントとして使用しました。代わりに、これを配列構造などにプッシュできます...

于 2009-02-12T14:49:44.330 に答える
0

id と url をキーにした配列を使用して、値を反復処理し、次のように追加します。

$link_categories[ $id ] .= $category." ";

$result = mysql_query("SElECT * FROM LINKS");

$link_categories = array();

while ($row = mysql_fetch_array($result,MYSQL_ASSOC))
{
    if (!isset($link_categories[$row['link']]))
        $link_categories[$row['link']] = " ";
    else
        $link_categories[$row['link']] .= " ";

    $link_categories[$row['link']] .= $row['category'];
}

print_r($link_categories);

結果:

Array
(
    [http://a.com] =>  test evaluate performance
    [http://b.com] =>  classify reduce
    [http://c.com] =>  allocate
)

これは「正しい」方法ではありません。実際には、1 対多の関係を持つ別のテーブルで関係を定義する必要があります。

于 2009-02-12T14:43:22.070 に答える