Pergunta

Eu só lidei com um-para-um relacionamento em php até agora, mas eu estou preso em um problema que envolve um relacionamento um-para-muitos. Eu estive sentado sobre isso por alguns dias sem sorte, então eu estou desesperado por alguém para intervir e mostrar-me uma solução antes que eu perca minha mente.

No meu banco de dados tem uma série de urls, que são recebidos por uma consulta SELECT, juntamente com vários outros campos, de diferentes tabelas. Cada URL tem pelo menos uma categoria associada a ele, mas pode ter várias categorias. Então nos meus resultados que eu poderia ver algo que parece um pouco com isto:

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'

Eu tenho isso para trabalho, tipo de. Quando eu percorrer e imprimi-los fora, usando um loop while e MySQL buscar array, os olhares resultado exatamente como ele faz acima. Isso é ótimo, exceto o que eu preciso é para que ler algo como:

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

De modo que, basicamente, todas as categorias para cada url se combinados de alguma forma, como eles são impressos. Minha primeira tentativa levou-me a tentar um loop while aninhados, mas não funcionou e eu não tenho certeza se isso é viável. Além de que eu estou querendo saber se eu poderia precisar de uma matriz multidimensional (suposição completa, eu nunca tive que usar um antes).

Estou ordenando esses resultados por ID de destino como acima, assim que eu sei se o ID de link na iteração do loop atual, corresponde ao que na última iteração - então eu tenho algo que tem mais de uma categoria .. Eu acho que estou muito perto, mas eu simplesmente não consigo descobrir isso.

Todas as idéias?

Foi útil?

Solução

Há também a função "GROUP_CONCAT" em mysql. Isso deve fazer exatamente o que você deseja alcançar.

Algo como:

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

Outras dicas

Você deve estar usando uma tabela de ligação.

1º você tem uma tabela de ligações

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

Em seguida, você tem uma tabela de categorias

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

Em seguida, você tem uma tabela de conexão

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

Isto deve pelo menos começar.

Você precisa usar um algoritmo de controle de pausa.

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

Eu usei "html exibição" como um evento de "trabalho" genérico, você poderia empurrar isso para uma estrutura de matriz, etc., em vez ...

usar uma matriz digitado no código e o URL percorrer os valores e adicionar-lhe o seguinte:

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

Resultados em:

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

Esta não é a maneira 'certa' de fazer isso - realmente as relações devem ser definidos em um independentes mesa com um 1-muitos.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top