PHP и вывод результатов один-ко-многим - PullRequest
3 голосов
/ 12 февраля 2009

До сих пор я имел дело только с отношениями один-к-одному в php, но я застрял в проблеме, которая включает отношения один-ко-многим. Я сидел на этом несколько дней без удачи, поэтому я отчаянно нуждаюсь в том, чтобы кто-то вмешался и показал мне решение, прежде чем я сошел с ума.

В моей базе данных есть ряд URL-адресов, которые получены запросом SELECT вместе с различными другими полями из разных таблиц. Каждый URL имеет по крайней мере одну категорию, связанную с ним, но может иметь несколько категорий. Так что в моих результатах я могу увидеть что-то вроде этого:

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'

У меня это работает, вроде. Когда я зацикливаюсь и распечатываю их, используя цикл while и массив извлечения mysql, результат выглядит точно так же, как и выше. Это здорово, за исключением того, что мне нужно, чтобы прочитать что-то вроде:

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

Так что в основном все категории для каждого URL объединяются как-то по мере их вывода на печать. Моя первая попытка побудила меня попробовать вложенный цикл while, но он не сработал, и я не уверен, возможно ли это. Кроме того, мне интересно, может ли мне понадобиться многомерный массив (полное предположение, мне никогда не приходилось использовать его раньше).

Я упорядочиваю эти результаты по идентификатору ссылки, как указано выше, поэтому я знаю, совпадает ли идентификатор ссылки в текущей итерации цикла с идентификатором в последней итерации - тогда у меня есть нечто, имеющее более одной категории ... Я думаю, Я действительно близко, но я просто не могу понять это.

Есть идеи?

Ответы [ 4 ]

3 голосов
/ 12 февраля 2009

В mysql также есть функция GROUP_CONCAT. Это должно делать именно то, что вы хотите достичь.

Что-то вроде:

SELECT url, GROUP_CONCAT(category) AS categories FROM yourtable GROUP BY url 
0 голосов
/ 12 февраля 2009

использовать массив с ключом для идентификатора и URL-адреса перебирать значения и добавлять к нему следующее:

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

Результат:

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

Это не «правильный» способ сделать это - на самом деле отношения должны быть определены в отдельная таблица с отношением 1-много.

0 голосов
/ 12 февраля 2009

вам нужно использовать алгоритм прерывания управления.

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

Я использовал «display html» как общее «рабочее» событие, вы могли бы выдвинуть это в структуру массива и т. Д. Вместо этого ...

0 голосов
/ 12 февраля 2009

Вы должны использовать таблицу соединений.

1-й у вас есть таблица ссылок

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

Тогда у вас есть таблица категорий

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

Тогда у вас есть таблица соединений

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

Это должно как минимум начать.

...