Visualizzazione risultati 1 fino 5 di 5

Discussione: ragruppare tutto in base a ID principale

  1. #1
    personalthings non è connesso Utente giovane
    Data registrazione
    10-08-2013
    Messaggi
    73

    Predefinito ragruppare tutto in base a ID principale

    Ho una tabella chiamata forum così formata:

    `id_messaggio` bigint(20) NOT NULL,
    `id_messaggio_origine` bigint(20) NOT NULL DEFAULT '0',
    `titolo` varchar(255) DEFAULT NULL,
    `messaggio` text,
    `autore` varchar(20) DEFAULT NULL,
    `data_messaggio` datetime DEFAULT NULL
    Nel momento in cui apro un thread nuovo (che chiameremo Prova):
    - id_messaggio viene settato con last_id (ad esempio 340)
    - id_messaggio_origine su 0.

    Nel momento in cui rispondo a questo thread:
    - id_messaggio viene settato con last_id (ad esempio 1340)
    - id_messaggio_origine su 340 (dunque l'id_messaggio del messaggio origine).

    Tutto qui benissimo.
    Ho dunque fatto uno script di ricerca:

    Codice PHP:
    <?php
    $ricerca
    = $_POST['ricerca'];
    if(
    gdrcd_filter('get', $_REQUEST['op']) == 'search') {
    $result = gdrcd_query("SELECT * FROM forum WHERE (titolo LIKE '%$ricerca%' OR messaggio LIKE '%$ricerca%' OR autore LIKE '%$ricerca%') ORDER BY data_messaggio DESC LIMIT", 'result');
    }
    ?>

    <form action="main.php?page=forum&op=search" method="post">
    <input name="ricerca" />
    <input type="submit" value="cerca" />
    </div>
    </form>

    <?php
    while($row = gdrcd_query($result, 'fetch')) {
    //risultati ricerca
    }
    Qui nasce il problema
    Quando vado a ricercare la parola, nella lista dei risultati mi compaiono tutti i messaggi.
    Ecco, io vorrei raggruppare i messaggi e visualizzare solo il titolo del id_messaggio_origine.

    Ad esempio, se io cercassi la parola OBBLIGO, il risultato sarebbero 5 risultati, ossia:

    id_messaggio 1340
    id_messaggio_origine 1

    id_messaggio 1349
    id_messaggio_origine 1

    id_messaggio 11340
    id_messaggio_origine 3

    id_messaggio 1331
    id_messaggio_origine 7

    id_messaggio 21340
    id_messaggio_origine 7

    Io vorrei che la lista non me li visualizzasse tutti e 5, ma solo 3 (vale a dire 1, 3 e 7, che sono l'origine).

    Non so se ho reso chiaro il concetto.

  2. #2
    L'avatar di dreadnaut
    dreadnaut non è connesso Super Moderatore
    Data registrazione
    22-02-2004
    Messaggi
    6,259

    Predefinito

    Se ho capito bene id_messaggio_origine ti dice a quale "thread" o discussione appartiene un messaggio?

    Direi che ti serve un GROUP BY `, subito prima di ORDER BY. Vedi ad esempio https://learnsql.com/blog/group-by-in-sql-explained/

  3. #3
    personalthings non è connesso Utente giovane
    Data registrazione
    10-08-2013
    Messaggi
    73

    Predefinito

    Citazione Originalmente inviato da dreadnaut Visualizza messaggio
    Se ho capito bene id_messaggio_origine ti dice a quale "thread" o discussione appartiene un messaggio?

    Direi che ti serve un GROUP BY `, subito prima di ORDER BY. Vedi ad esempio https://learnsql.com/blog/group-by-in-sql-explained/

    E' esattamente quello che voglio fare.
    Quindi sarebbe?

    Codice PHP:
    $result = gdrcd_query("SELECT * FROM forum WHERE (titolo LIKE '%$ricerca%' OR messaggio LIKE '%$ricerca%' OR autore LIKE '%$ricerca%') GROUP BY id_messaggio_origine ORDER BY data_messaggio DESC LIMIT", 'result');
    Perché con questa sintassi il risultato non cambia.

  4. #4
    L'avatar di dreadnaut
    dreadnaut non è connesso Super Moderatore
    Data registrazione
    22-02-2004
    Messaggi
    6,259

    Predefinito

    Hai letto la pagina che ti ho indicato? Ti spiega come usare GROUP BY, e cosa produce.

    Se non fa al caso tuo, invece di raggruppare magari vuoi estrarre un elemento specifico? Tipo "quello con id più piccolo" oppure "quello inviato prima degli altri?". Per alcuni di questi puoi usare GROUP BY, ma per altri ti server probabilmente un JOIN sulla tabella stessa, dove confronti elementi per trovare "il più <condizione>"
    Ultima modifica di dreadnaut : 14-01-2023 alle ore 12.32.42

  5. #5
    personalthings non è connesso Utente giovane
    Data registrazione
    10-08-2013
    Messaggi
    73

    Predefinito

    Citazione Originalmente inviato da dreadnaut Visualizza messaggio
    Hai letto la pagina che ti ho indicato? Ti spiega come usare GROUP BY, e cosa produce.

    Se non fa al caso tuo, invece di raggruppare magari vuoi estrarre un elemento specifico? Tipo "quello con id più piccolo" oppure "quello inviato prima degli altri?". Per alcuni di questi puoi usare GROUP BY, ma per altri ti server probabilmente un JOIN sulla tabella stessa, dove confronti elementi per trovare "il più <condizione>"
    Sì, ho letto.
    No, non devo estrarre un elemento specifico (tipo "quello con id più piccolo"), né fare un JOIN, perchè tutto è contenuto dentro una singola tabella (quella forum).

    Devo semplicemente ricercare un termine dentro i diversi id_messaggio e, dentro il ciclo while, visualizzare i risultati con una lista di id_messaggio_origine a cui id_messaggio attinge.

Regole di scrittura

  • Non puoi creare nuove discussioni
  • Non puoi rispondere ai messaggi
  • Non puoi inserire allegati.
  • Non puoi modificare i tuoi messaggi
  •