Domanda

Ho affrontato solo con un-a-uno in PHP finora, ma mi sono bloccato su un problema che coinvolge una relazione uno-a-molti. Sono stato seduto su questo per un paio di giorni senza fortuna, quindi sono alla disperata ricerca di qualcuno di intervenire e mi mostra una soluzione prima di perdere la mia mente.

Nel mio database avere una serie di URL, che vengono ricevuti da una query SELECT insieme a vari altri campi, da tabelle diverse. Ogni URL ha almeno una categoria ad esso associati, ma può avere più categorie. Così nei miei risultati potrei vedere qualcosa che sembra un po 'come questo:

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'

ho ottenuto questo al lavoro, tipo di. Quando ho scorrere e stampare, utilizzando un ciclo while e mysql recuperano matrice, il risultato appare esattamente come lo fa sopra. Quello è grande, se non quello che ho bisogno è per poter leggere qualcosa come:

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

Quindi, che in fondo tutte le categorie per ogni URL ottenere combinati in qualche modo, in quanto sono stampati. Il mio primo tentativo mi ha portato a provare un po 'di ciclo nidificato, ma non ha funzionato e non sono sicuro se questo è fattibile. A parte che mi chiedo se potrei avere bisogno di un array multidimensionale (completa indovinare, non ho mai dovuto usare uno prima).

Sono ordinare questi risultati tramite link id come sopra, in modo da sapere se l'id collegamento nel ciclo corrente, corrisponde a quello in ultima iterazione - poi ho qualcosa che ha più di una categoria .. Credo sono davvero vicino, ma non riesco proprio a capirlo.

Tutte le idee?

È stato utile?

Soluzione

C'è anche la funzione di "group_concat" in mysql. Questo dovrebbe fare esattamente quello che si vuole raggiungere.

Qualcosa di simile:

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

Altri suggerimenti

Si deve usare una tabella di connessione.

prima di avere una tabella di collegamenti

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

Allora avete una tabella di categorie

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

Poi si dispone di una tabella dei collegamenti

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

Questo dovrebbe atleast iniziare.

è necessario utilizzare un algoritmo di pausa di controllo.

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

Ho usato "visualizzazione html" come un evento generico "lavoro", si potrebbe spingere questo fuori ad una struttura a matrice, ecc invece ...

utilizzare una matrice calettato sul ID e URL iterata attraverso i valori e aggiungere ad essa come segue:

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

Risultati in:

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

Questo non è il modo 'giusto' di fare questo - realmente i rapporti dovrebbero essere definiti in un tavolo separato con un 1-molti.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top