PHP ve bir-çok sonuç çıktısı

4 Cevap php

Ben şimdiye kadar sadece php bire-bir ilişkileri ele ettik, ama bir-çok ilişkisi içeren bir sorun takılıp ediyorum. Ben hayır şans ile bir kaç gün için bu oturuyorum, bu yüzden birisi çıkıp ben aklımı kaybetmeden önce bana bir çözüm göstermek için umutsuz değilim.

Benim veritabanında farklı tablolardaki çeşitli alanlarda, birlikte bir SELECT sorgusu tarafından alınan URL'ler bir dizi var. Her url onunla ilişkili en az bir kategori vardır, fakat birden fazla kategoriye sahip olabilir. Yani benim sonuçlarında ben böyle biraz görünüyor şey görebilirsiniz:

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'

Ben tür, çalışmalarına bu var. Yukarıda yaptığı gibi tam ben döngü ve bir süre döngü kullanarak, onları baskı ve mysql dizi getirme, sonuç arar. Thats büyük, ben gibi bir şey okumak için gerekenler hariç:

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

Onlar basılı olarak böylece temelde her url için tüm kategoriler, bir şekilde kombine almak. Benim ilk girişimi iç içe geçmiş bir while döngüsü denemek için götürdü, ama işe yaramadı ve bu mümkün olup olmadığından emin değilim. Ben çok boyutlu bir dizi (tam tahminim, ben önce birini kullanmak zorunda kalmıştım) gerekebilir eğer bunun dışında ben merak ediyorum.

Ben yukarıdaki gibi bağlantı kimliği ile bu sonuçları emrediyorum, bu nedenle akım döngü tekrarında bağlantı kimliği, son tekrarında bir eşleşirse biliyorum - o zaman ben birden fazla kategori olan bir şey var .. Ben olduğumu düşünüyorum gerçekten yakın, ama ben sadece bunu anlamaya olamaz.

Herhangi bir fikir?

4 Cevap

There is also the "GROUP_CONCAT" function in mysql. That should do exactly what you want to achieve.

Gibi bir şey:

SELECT url, GROUP_CONCAT(category) AS categories FROM yourtable GROUP BY url

Eğer bir bağlantı tablo kullanıyor olmalıdır.

1. Eğer bağlantıların bir tablo var

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

Sonra kategorilerde bir tablo var

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

Sonra bir bağlantı tablo var

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

Bu en az başlamak gerekir.

Bir kontrol molası algoritmasını kullanmanız gerekir.

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

Ben bunun yerine bir dizi yapısı, vb bu dışarı itmek olabilir, genel bir "iş" bir olay olarak "görüntü html" kullanılır ...

değerler üzerinden kimliği ve url 'döngü anahtarlı bir dizi kullanmak ve aşağıdaki gibi ekleyin:

$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);

Sonuçlar:

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

This isn't the 'right' way of doing this - really the relationships should be defined in a seperate table with a 1-many relationship.