Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 18

Discussione: [SQL] query complessa

  1. #1
    Utente di HTML.it L'avatar di andbaz
    Registrato dal
    Jul 2011
    Messaggi
    441

    [SQL] query complessa

    Ho un problema, non riesco ad ottenere i risultati che vorrei con un'interrogazione al mio database, e se sono qui è perché non credo di poter riuscire questo problema da solo quindi chiedo aiuto.

    Ho due tabelle: POST e TAG

    Nella tabella POST vengono tenuti tutti i post pubblicati da tutti gli utenti del mio piccolo social network con diversi campi, come ad esempio
    IDP: id del post | IDU: id utente del post | TAG: parole chiave associate a questo post (max 3).

    Nella tabella TAG, invece, ho solo due campi, ovvero
    IDU: id utente | TAG: tag a cui è iscritto l'utente.

    Ora mi spiego meglio: ogni utente può iscriversi ad un numero indefinito di tag, così da poter vedere sulla sua home anche tutti i post che contengono nel campo TAG una tag simile, o uguale, a quella a cui è iscritto.

    Quindi pensavo di inserire nella tabella TAG molti record, ogni uno dei quali ha una diversa tag nel campo TAG, e ovviamente nel campo IDU il mio id, così da potere vedere sulla mia home i post contenenti tag simili a quelle, alle quali sono iscritto.

    Per chi non avesse ancora capito: se io mi sono iscritto alla tag #STEVEJOBS vorrei che sulla mia home venissero stampati tutti i post contenenti una sequenza di lettere simile a quella della mia tag, come #STEVE, #JOBS, oppure anche #EVEJOB. Per questo mi sono servito dell'operatore LIKE.

    Quindi se io fossi il compilatore, se così si chiama, farei questo: Andrei prima nella tabella TAG a prendere tutti i record con il mio stesso IDU e poi prenderei tutte le TAG.
    Poi andrei in POST e prenderei tutti i dati dei post con TAG simili o uguali a quelle a cui sono iscritto.

    Le ho provate tutte, veniamo al codice:

    Codice PHP:
    $sql "SELECT * FROM TAG WHERE IDU=$idu";
    $que mysql_query($sql);
    while (
    $row mysql_fetch_assoc($que)) {
        
    $ris $row['TAG']; /* TAG */
    }
    $sql "SELECT * FROM POST WHERE TAG LIKE '%$ris%'";
    $que mysql_query($sql);
    while (
    $row mysql_fetch_assoc($que)) {
        
    $text $row['TESTO']; /* POST */
        
    echo $text;

    Con questo script il compilatore mi stampa solo i post a cui è associata l'ultima tag presa dalla tabella TAG con id uguale al mio.
    Dove erro, e perché, come risolvo?
    Se ancora non è chiaro il mio problema, sono qui

  2. #2
    Utente di HTML.it L'avatar di andbaz
    Registrato dal
    Jul 2011
    Messaggi
    441
    UP

  3. #3

    Re: [SQL] query complessa

    Originariamente inviato da andbaz

    Codice PHP:
    $sql "SELECT * FROM TAG WHERE IDU=$idu";
    $que mysql_query($sql);
    while (
    $row mysql_fetch_assoc($que)) {
        
    $ris $row['TAG']; /* TAG */
    }
    $sql "SELECT * FROM POST WHERE TAG LIKE '%$ris%'";
    $que mysql_query($sql);
    while (
    $row mysql_fetch_assoc($que)) {
        
    $text $row['TESTO']; /* POST */
        
    echo $text;

    Con questo script il compilatore mi stampa solo i post a cui è associata l'ultima tag presa dalla tabella TAG con id uguale al mio.
    Dove erro, e perché, come risolvo?
    Se ancora non è chiaro il mio problema, sono qui
    Per forza che trovi solo l'ultimo. Nella prima query il while esegue tutta la scansione del result set e ti rende solo l'ultimo perche' $ris viene sovrascritto continuamente.

    Dovresti eseguire la seconda query "dentro" il primo ciclo while.

    Il silenzio è spesso la cosa migliore. Pensa ... è gratis.

  4. #4
    Utente di HTML.it L'avatar di andbaz
    Registrato dal
    Jul 2011
    Messaggi
    441
    Ok, credo di avere risolto però ho sempre un piccolo problema, posto i codice!

    In breve: tra le mie tag a cui sono iscritto ho #ANGURIA #COCCO #BANANA, e quindi si, mi vengono stampati tutti i post che hanno nel loro campo tag una tra queste, però se un post ha sia #COCCO e #BANANA me lo stampa due volte!

    Come risolvo?

    Codice PHP:
    $sql "SELECT * FROM TAG WHERE IDU=$idu";
    $que mysql_query($sql);
    $num mysql_num_rows($que);
    while (
    $row mysql_fetch_assoc($que)) {
        
    $ris $row['TAG'];
        
    $sql2 "SELECT * FROM POST WHERE TAG LIKE '%$ris%'";
        
    $que2 mysql_query($sql2);
        
    $num2 mysql_num_rows($que2);
        for (
    $i=0$i<$num2$i++) {
            while (
    $row2 mysql_fetch_assoc($que2)) {            
               
    $text $row2['TESTO'];                        
               echo 
    $text;
            }
        }                        


  5. #5
    Utente di HTML.it L'avatar di alpynet
    Registrato dal
    Mar 2010
    Messaggi
    123
    Ciao, nella query usa DISTINCT

  6. #6
    Utente di HTML.it L'avatar di andbaz
    Registrato dal
    Jul 2011
    Messaggi
    441
    No ho risolto in un modo più elegante, senza DISTINCT.

    Però ora perchè mi dice: the used select statements have a different number of columns.

    Questa è la mia query, e se eliminassi il SELECT in mezzo, cioè quello che prende i dati anche dalla tabella SYSTEM, non mi compare più l'errore.

    Non capisco, eppure la tabella POST non cambia, ha sempre lo stesso numero e tipo di colonne!

    Perchè mi risulta questo errore?
    Quale potrebbe essere il problema qui?

    Codice PHP:
    $sql2 " SELECT * FROM POST WHERE IDU=$idu UNION
            SELECT * FROM POST, SYSTEM WHERE SYSTEM.IDF=
    $idu AND POST.IDU=SYSTEM.IDH UNION
            SELECT * FROM POST WHERE TAG LIKE '%
    $ris%' AND IDU<>$idu ORDER BY IDP DESC"

  7. #7
    SELECT * FROM POST
    SELECT * FROM POST, SYSTEM

    nella seconda select richiami tutti i campi sia di post che di system

    Metti l'elenco dei soli campi che vuoi estrarre al posto di * e che devono essere gli stessi sia per la prima che per le altre select in union.

    Il silenzio è spesso la cosa migliore. Pensa ... è gratis.

  8. #8
    Utente di HTML.it L'avatar di andbaz
    Registrato dal
    Jul 2011
    Messaggi
    441
    No, niente, ho provato e riprovato su questo con diverse possibilità, però non funziona, stesso errore, possibile?

    TAB POST
    IDP | IDU | NOME | COGNOME | TESTO | TAG | COM | PIU | DATA | ORA | TS

    TAB SYSTEM
    IDF | IDH

  9. #9

  10. #10
    Utente di HTML.it L'avatar di andbaz
    Registrato dal
    Jul 2011
    Messaggi
    441
    Codice PHP:
    $sql2 "SELECT * FROM POST WHERE IDU=$idu UNION                        
        SELECT * FROM POST WHERE TAG LIKE '%
    $ris%' AND IDU<>$idu UNION
        SELECT * FROM POST, SYSTEM WHERE IDF=
    $idu AND IDU=IDH AND IDF<>IDH ORDER BY IDP DESC"

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2026 vBulletin Solutions, Inc. All rights reserved.