sql >> Databáze >  >> RDS >> Mysql

PHP – vnořený seznam rozdělený na sudé sloupce (oprava a aktualizace)

V obou otázkách jste neuvedli, co je databázová tabulka, takže na ni nemohu konkrétně odpovědět, ale nastíním svůj návrh.

Můžete použít agregační funkce v mysql k získání vašich příspěvků seřazených a seskupených podle témat vč. jejich počet. Nejprve můžete provést dva dotazy, abyste získali počty, to trochu závisí na tom, jak chcete s daty nakládat.

V každém případě pomocí mysql_... funkcí, všechna vámi vybraná data z databáze budou v paměti (kvůli vnitřnostem dokonce dvakrát). Takže mít další pole jako ve vaší předchozí otázce by nemělo moc bolet díky kopírování optimalizace zápisu v PHP. Efektivně jen malá režie.

Kromě toho, než se postaráte o skutečný výstup, měli byste si dát svá data do pořádku, abyste nemuseli míchat zpracování dat a logiku výstupu. Míchání dělá věci složitější, a proto je těžší je vyřešit. Pokud například vložíte svůj výstup do jednoduchých funkcí, bude to jednodušší:

function render_list($title, array $entries)
{
    echo '<ul><li>', $title, '<ul>';
    foreach($entries as $entry)
    {
        echo '<li>', $entry['NewsID'], '</li>';
    }
    echo '</ul></li></ul>;
}

function render_column(array $topics)
{
    echo '<div class="column">';
    foreach($topics as $topic)
    {
        render_list($topic['title'], $topic['entries']);
    }
    echo '</div>';
}

To již řeší váš problém s výstupem, takže se o to již nemusíme starat. Musíme se jen starat o to, co vložíme do těchto funkcí jako parametry.

X témat na variantu sloupce:

U této varianty by data měla být pole s jedním tématem na hodnotu, jako jste to udělali u předchozí otázky. Řekl bych, že už je to vyřešené. Nevím, jaký konkrétní problém máte s počtem sloupců, výpočet vypadá dobře, takže to přeskakuji, dokud o tom neuvedete konkrétní informace. "Nefunguje" nesplňuje podmínky.

X zpráv na variantu sloupce:

Tohle je zajímavější. Zde je snadným krokem pokračovat v předchozím tématu dalším sloupcem opětovným přidáním názvu tématu. Něco jako:

Topic A    Topic A    Topic B
 - A-1      - A-5      - B-4
 - A-2     Topic B     - B-5
 - A-3      - B-1      - B-6
 - A-4      - B-2
            - B-3

Abyste toho dosáhli, musíte svá data zpracovávat trochu jinak, konkrétně podle počtu položek (novinek).

Řekněme, že se vám podařilo získat seskupená (a tedy seřazená) data z vaší databáze:

SELECT TopicName, NewsID FROM news GROUP BY 1;

Poté můžete pouze iterovat všechny vrácené řádky a vytvořit své sloupce a nakonec je vytisknout (již vyřešeno):

$itemsPerColumn = 4;

// get columns
$topics = array();
$items = 0;
$lastTopic = NULL;

foreach ($rows as $row)
{
    if ($lastTopic != $row['TopicName'])
    {
        $topic = array('title' => $row['TopicName']);
        $topics[] = &$topic;
    }
    $topic['entries'][] = $row;

    $items++;
    if ($items === $itemsPerColumn)
    {
        $columns[] = $topics;
        $topics = array();
        $lastTopic = NULL;
    }
}

// output
foreach($columns as $column)
{
    render_column($column);
}

Takže to je ve skutečnosti srovnatelné s předchozí odpovědí, ale tentokrát nemusíte znovu uspořádat pole, abyste získali zprávy uspořádané podle jejich tématu, protože to již dělá databázový dotaz (můžete to udělat i pro předchozí odpověď ).

Pak je to opět stejné:Iterace přes vrácenou sadu výsledků a přenesení dat do struktury, kterou můžete vytisknout. Vstup, zpracování, výstup. Vždy je to stejné.

Doufám, že vám to pomůže.




  1. One-to-Many SQL SELECT do jednoho řádku

  2. Jak mohu číst hodnotu z mysql pomocí PHP

  3. Příklady řetězců a čísel Oracle

  4. Vytvoření tabulky serveru SQL z datové tabulky C#