Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 13
  1. #1

    estrazione tag relativi da bookmark (query piuttosto complessa)

    con un bel po' di input da parte di Faber ( realizzatore di smarking.com ), che ringrazio ancora moltissimo ,sto realizzando anche io un piccolo bookmark che servirà nella intranet della ditta in cui lavoro, e ho un problema nell'estrazione dei tag relativi...

    ho questa tabella di tag:

    codice:
    INSERT INTO `bookmarkTags` (`userID`, `bookmarkID`, `tag`) VALUES
    (1, 1, 'manuale'),
    (1, 1, 'on line'),
    (1, 1, 'php'),
    (1, 2, 'manuale'),
    (1, 2, 'manuali');
    dove, i primi 3 record sono relativi al bookmark 1 e gli ultimi 2, ovviamente, al bookmark 2
    come si può ben vedere il campo userID è chiave esterna relativa alla tabella degli utenti, mentre il campo bookmarkID è chiave esterna verso la tabella dei bookmark.

    La query che uso per estrarre i tag (relativi o meno) è questa:

    Codice PHP:
    $sql="select b.tag, count(b.userID) as tagCount from  bookmarkTags a, bookmarkTags b where a.userID=b.userID and a.bookmarkID=b.bookmarkID and a.tag in ($tag) and b.tag not in ($tag) group by b.tag order by tagCount desc, b.tag"
    dove $tag è una stringa che può contenere: 'php' oppure 'php','manuale' etc etc

    il problema inizia a presentarsi nel momento in cui seleziono due o più tag.
    Perché se $tag vale solamente php il funzionamento è corretto, mi estrae i tag relativi: manuale e on line
    se a questo punto seleziono anche manuale ( e $tag diventa quindi 'php','manuale' ) il risultato di quella query mi diventa on line e manuali...

    non capisco perché mi estrae anche manuali...che prima non c'era. E a rigor di logica non dovrebbe estrarmelo in quanto manuali è in relazione SOLO con manuale, NON anche con php...
    L'unico tag correlato SIA a php SIA a manuale dovrebbe essere on line.



    Qualcuno mi aiuta a capire dove sto sbagliando?









    Grazie infinite!
    Talvolta anche una persona apparentemente inutile si rivela un abile samurai dalla forza di mille uomini, dimostrando di poter rinunciare alla vita e che il suo cuore si è completamente identificato con quello del suo padrone

  2. #2
    Talvolta anche una persona apparentemente inutile si rivela un abile samurai dalla forza di mille uomini, dimostrando di poter rinunciare alla vita e che il suo cuore si è completamente identificato con quello del suo padrone

  3. #3
    passato bene il weekend?
    Talvolta anche una persona apparentemente inutile si rivela un abile samurai dalla forza di mille uomini, dimostrando di poter rinunciare alla vita e che il suo cuore si è completamente identificato con quello del suo padrone

  4. #4
    Utente di HTML.it L'avatar di luca200
    Registrato dal
    Apr 2002
    Messaggi
    4,120
    Non mi è chiaro quello che vuoi fare, e non capisco perché metti la tabella in join con se stessa

  5. #5
    quello che voglio fare è un bookmark...


    praticamente con quella query dovrei estrarre i tag relativi a quello ( o quelli ) già selezionati.
    Per intenderci, appena l'utente entra vede la lista di tutti i tag disponibili, quindi, riprendendo l'esempio sopra vedrebbe: manuale, on line, php, manuale, manuali

    a questo punto mettiamo che l'utente seleizoni il tag php, come si vede dalla tabella dei tag, php è in relazione con: on line, manuale, manuali

    e quindi con quella query io dovrei tirar fuori proprio quei 3 tag, e fin qui va benone.

    Ora, mettiamo che l'utente selezioni il tag manuale ( e quindi il mio $tag diventa: 'manuale','php')
    a questo punto io devo estrarre i tag che sono in relazione SIA con manuale SIA con php, e a rigor di logica dovrebbe estrarmi solo on line, e invece mi estrae anche manuali che è in relazione SOLO con il tag manuale.

    la join con la tabella stessa mi è stata suggerita appunto da Faber ed essendo l'unica tabella contenente i tag e la relativa relazione con i bookmark penso sia l'unica strada percorribile, a meno di dover fare una funzione apposita che mi faccia n query a swconda del numero dei tag selezionati...ma non mi sembra la soluzione ottimale...




    Talvolta anche una persona apparentemente inutile si rivela un abile samurai dalla forza di mille uomini, dimostrando di poter rinunciare alla vita e che il suo cuore si è completamente identificato con quello del suo padrone

  6. #6
    se ho spiegato male ditemelo, è una cosa piuttosto importante e urgente...sto provando soluzioni alternative ma non riesco ad ottenere il risultato che ho descritto
    Talvolta anche una persona apparentemente inutile si rivela un abile samurai dalla forza di mille uomini, dimostrando di poter rinunciare alla vita e che il suo cuore si è completamente identificato con quello del suo padrone

  7. #7
    Il risultato che ottieni e' corretto per la query che fai.

    Il contenuto di IN() e NOT IN() e' in OR, quindi otterrai 2 risultati per "manuale, php" su bookmarkID 1 e uno per "manuale" su bookmarkID 2.

    una volta identificato userID e bookmarkID a cui appartiene la prima scelta (php) dovresti usare questi id di gruppo per effettuare la query successiva. es.:

    codice:
    select tag, count(userID) as tagCount 
    from  bookmarkTags
    where bookmarkID = 1
    and userID = 1 
    and tag NOT in ('php', 'manuale')
    group by tag
    ma forse non ho capito una cippa di quello che vuoi fare

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

  8. #8
    Utente di HTML.it L'avatar di luca200
    Registrato dal
    Apr 2002
    Messaggi
    4,120
    Originariamente inviato da 13manuel84
    se ho spiegato male ditemelo
    Francamente non saprei. Di sicuro io non ci ho capito una mazza

  9. #9
    boh! io meglio di così non lo so spiegare...ho postato anche la struttura della tabella e detto cosa dovrebbe estrarre a seconda delle selezioni dell'utente.
    Ci riprovo

    avete presente segnalo.com? ecco il funzionamento dei tag dev'essere come quello; ossia all'inizio verranno fatti vedere tutti i tag disponibili, a questo punto mettiamo che l'utente selezioni il tag php. Succede che vengono fatti vedere, non più tutti i tag, ma solo quelli che hanno una relazione con php. Ossia vengono fatti vedere i tag relativi ai bookmark in cui compare anche php come tag...e forse è questa la parte che non riesco a spiegare.
    Prendiamo in esame la tabella che allego sotto.

    come vedete ho 3 bookmarks identificati dai seguenti tag:
    [list=1][*]bookmark 1: funzioni, manuale, on line, php[*]bookmark 2: manuale, manuali[*]bookmark 3: classi, funzioni, on line, php[/list=1]

    ora, quando il mio utente entra nell'area vedrà un lista di tutti i bookmark e potrà selezionare quello che vuole ovviamente. Mettiamo che selezioni php, quindi i tag relativi a php sono: funzioni, manuale, on line, classi...perché sono i tag che compaiono negli stessi bookmark in cui è presente anche la parola php.
    Supponiamo che ora, dalla lista assottigliata, l'utente selezioni il tag funzioni. Benissimo, ora devo selezionare i tag relativi all'accoppiata php, funzioni; vale a dire selezionare i tag che compaiono dove sono presenti i 2 già selezionati. Facendo riferimento sempre all'esempio in questione, i tag relativi sono, a questo punto manuale, classi, on line. Dal ragionamento che sto facendo quindi se ora l'utente seleziona classi ottengo come tag relativo alla tupla php, funzioni, classi solo il tag on line in quanto è l'unico tag presente negli stessi bookmark in cui sono presenti i 3 tag selezionati precedentemente.




    spero con questo piccolo step-to-step di essere riuscito a spiegarmi meglio. Rimango in attesa di una vostra illuminazione...nel frattempo cerco di costruirmi una funzione che non sovraccarichi troppo il serveruccio











    Grazie mille per la disponibilità e per ogni aiuto!
    Immagini allegate Immagini allegate
    Talvolta anche una persona apparentemente inutile si rivela un abile samurai dalla forza di mille uomini, dimostrando di poter rinunciare alla vita e che il suo cuore si è completamente identificato con quello del suo padrone

  10. #10
    ma non esiste un IN che ritorni vero solo se TUTTI i parametri sono stati trovati?
    cioè, mi sembra una cosa abbastanza utile perché non abbiano pensato di implementarla, no?

    se dovesse per caso esistere potrei aver risolto l'arcano problema...ma non la trovo e scrivere una funzione mi sto incasinando in maniera esponenziale: ogni riga di codice che scrivo, la difficoltà ad andare avanti è doppia rispetto alla precedente
    Talvolta anche una persona apparentemente inutile si rivela un abile samurai dalla forza di mille uomini, dimostrando di poter rinunciare alla vita e che il suo cuore si è completamente identificato con quello del suo padrone

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 © 2024 vBulletin Solutions, Inc. All rights reserved.