Frage

Ich habe nur mit einer Eins-zu-eins-Beziehungen in PHP so weit, aber ich bin fest auf ein Problem behandelt, das eine Beziehung einer Eins-zu-viele beinhaltet. Ich habe kein Glück für ein paar Tage auf dieser Sitzung, so dass ich bin verzweifelt für jemand in Schritt und zeigen Sie mir eine Lösung, bevor ich meinen Verstand verliere.

In meiner Datenbank hat eine Reihe von URLs, die durch eine SELECT-Abfrage zusammen mit verschiedenen anderen Bereichen, aus verschiedenen Tabellen empfangen werden. Jede URL muss mindestens eine Kategorie mit ihm verbunden, kann aber mehrere Kategorien hat. Also in meinen Ergebnissen könnte ich etwas sehe, das ein bisschen wie folgt aussieht:

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'

Ich habe dies zur Arbeit kam, Art. Wenn ich Schleife durch und drucken sie ab, eine while-Schleife und mysql holen Array verwenden, sieht das Ergebnis genau wie es oben der Fall ist. Das ist großartig, außer dem, was ich brauche, ist für sie so etwas wie zu lesen:

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

So, dass im Grunde alle Kategorien für jede URL irgendwie kombiniert bekommen, wie sie ausgedruckt werden. Mein erster Versuch führte mich eine verschachtelte while-Schleife, um zu versuchen, aber es hat nicht funktioniert, und ich bin nicht sicher, ob dies machbar ist. Abgesehen davon, dass ich mich, wenn ich ein mehrdimensionales Array benötigen könnte (vollständige Vermutung, ich habe noch nie eine verwenden, bevor).

Ich befehle diese Ergebnisse durch Link-ID wie oben, damit ich weiß, ob der Link-ID in der Stromschleife Iteration, die man in der letzten Iteration übereinstimmt - dann etwas, was ich habe, die mehr als eine Kategorie hat .. Ich denke, ich bin wirklich in der Nähe, aber ich kann es einfach nicht herausfinden.

Irgendwelche Ideen?

War es hilfreich?

Lösung

Es gibt auch die "GROUP_CONCAT" -Funktion in mysql. Das sollte genau das tun, was Sie erreichen wollen.

So etwas wie:

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

Andere Tipps

Sie sollten eine Verbindungstabelle werden.

1. Sie haben eine Tabelle mit Links

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

Dann haben Sie eine Tabelle der Kategorien

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

Dann haben Sie eine Verbindungstabelle

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

Dies sollte atleast erhalten Sie begonnen haben.

Sie benötigen einen Gruppenwechsel-Algorithmus verwenden.

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

I „Anzeige html“ als generisches „Arbeit“ Ereignis verwendet, Sie könnte dies zu einer Arraystruktur Push-out etc. statt ...

einen Array auf der ID und URL Iterierte durch die Werte eingegeben verwenden und, um es hinzuzufügen, wie folgt:

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

Ergebnisse in:

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

Dies ist nicht der ‚richtige‘ Weg, dies zu tun - wirklich die Beziehungen sollten in einem definiert werden separate Tabelle mit einer 1-Beziehung.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top