Pregunta

Sólo he tratado con uno-a-uno relaciones en php hasta ahora, pero estoy atascado en un problema que implica una relación de uno a muchos. He estado sentado en esto durante unos días sin suerte, así que estoy desesperado para que alguien intervenga y me muestra una solución antes de que pierda mi mente.

En mi base de datos tiene una serie de direcciones URL, que son recibidas por una consulta SELECT junto con varios otros campos, de diferentes tablas. Cada URL tiene al menos una categoría asociada a ella, pero puede tener varias categorías. Así que en mis resultados que podría ver algo que se ve un poco como esto:

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'

He conseguido que esto funcione, algo así. Cuando bucle a través de e imprimirlas fuera, usando un bucle while y mysql traen matriz, el resultado es exactamente como se ve arriba. Eso es genial, excepto lo que necesito es para que se lea algo como:

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

Así que, básicamente, todas las categorías para cada url conseguir combinar de alguna manera, a medida que se imprimen. Mi primer intento me llevó a probar un tiempo de bucle anidado, pero que no funcionó y no estoy seguro si esto es factible. Aparte de eso me pregunto si puede ser que necesite una matriz multidimensional (conjetura completa, nunca he tenido que usar una antes).

estoy ordenando estos resultados mediante acoplamiento de la identificación que el anterior, por lo que saber si el identificador de enlace de la iteración actual del bucle, coincida con la de la última iteración - a continuación, tengo algo que tiene más de una categoría .. Creo estoy muy cerca, pero es que no puedo con ello.

¿Alguna idea?

¿Fue útil?

Solución

También existe la función "GROUP_CONCAT" en MySQL. Eso debería hacer exactamente lo que quiere lograr.

Algo así como:

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

Otros consejos

Usted debe estar utilizando una tabla de enlaces.

primero tiene una tabla de enlaces

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

A continuación, tiene una tabla de categorías

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

A continuación, usted tiene una tabla de conexión

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

Esto debería al menos empezar.

es necesario utilizar un algoritmo de interrupción de control.

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

He utilizado "html pantalla" como un evento genérico de "trabajo", que podría empujar esto a una estructura de matriz, etc., en lugar ...

utilizar una matriz enchavetado en el ID y la url iterar a través de los valores y añadir a la misma como sigue:

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

Los resultados en:

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

Esta no es la manera 'correcta' de hacer esto - realmente las relaciones deben ser definidos en una mesa separada con una 1-muchos relación.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top