Visualizzazione dei risultati da 1 a 7 su 7

Discussione: tag cloud

  1. #1
    Utente di HTML.it
    Registrato dal
    Aug 2007
    Messaggi
    250

    tag cloud

    Salve a tutti,
    gestisco i tag con 2 tabelle.

    TABELLA TAG composta da ID | NOME_TAG
    TABELLA TAG_CLOUD composta da ID | ID_TAG | ID_ ARTICOLO (serve x archiviare i vari articoli con diversi tag)

    Vorrei che quando richiamo un tag venissero suggeriti anche quei tag presenti nelle varie notizie in cui cè quello specifico tag.
    Esempio: clicco sul tag "news" vorrei che il sistema identificasse tutti gli articoli (ID_ARTICOLO) che hanno quel tag e mi stampasse anche gli altri tag presenti perchè di riflesso hanno degli argomenti in comune.

    Non sò se mi sono spiegato..
    io ho fatto una prova... ma non so' se la query è corretta e sensata...
    il problema è che mi trovo stampati tag "doppi"..

    Codice PHP:
    <?php
            $s1
    ="SELECT * FROM tagcloud WHERE id_tag='$_GET[tag]'";
            
    $r1=mysql_query($s1);
            while(
    $d1=mysql_fetch_array($r1)){
                
    $r2=mysql_query("SELECT * FROM tag WHERE id IN (SELECT id_tag FROM tagcloud WHERE id_art='$d1[id_art]')");
                while(
    $d2=mysql_fetch_array($r2)){
            
    ?>
                    <li class="capitalize">[url="elenco.phtml?tag=<?php echo $d2[id]; ?>"]<?php echo $d2['tag'?>[/url]
                <?php ?>

  2. #2
    Nella seconda SELECT metti un DISTINCT(id), in teoria dovrebbe prendere i vari tag una volta sola.

  3. #3
    Utente di HTML.it
    Registrato dal
    Aug 2007
    Messaggi
    250
    grazie della risposta!
    Ho provato... esito negativo! Sai forse perchè?..
    faccio questo ragionamento:

    PASSO 1
    Seleziono dalla tabella tag_cloud tutte quei record (che rappresentano poi la relazione tra tag e articolo)
    che contengono il tag selezionato.

    Codice PHP:
                   $s1="SELECT * FROM tagcloud WHERE id_tag='$_GET[tag]'";
            
    $r1=mysql_query($s1);
            while(
    $d1=mysql_fetch_array($r1)){ 
    Così facendo mi trovo tutti quegli articoli che hanno il tag scelto.
    Dentro il ciclo WHILE faccio una query che mi dice: "estrapola x ogni articolo che contiene questo tag, tutti gli altri tag"

    Codice PHP:
    $r2=mysql_query("SELECT * FROM tag WHERE id IN (SELECT DISTINCT(id_tag) FROM tagcloud WHERE id_art='$d1[id_art]')");
    while(
    $d2=mysql_fetch_array($r2)){ 
    Poi chiudo entrambi i cicli WHILE.
    Mi sa' che il distinct qui non funziona perchè me l'ho fa' per singolo articolo non per tutti gli articoli.
    Sono certo che la query non funziona per come è impostata. Sicuramente sbaglio ragionamento nel fare la query e che non riesco a capire che alternative ho!

  4. #4
    Perchè non si fanno le query dentro un ciclo, stilisticamente è un obrobrio. E poi ovviamente ti puoi trovare una marea di dati duplicati. Cerca su google come si fanno gli INNER JOIN e gli OUTER JOIN.

  5. #5
    ad occhio...

    select distinct tag.* from tag inner join tagcloud on tag.id=tagcloud.id_tag where tagcloud.id_articolo in
    (select distinct tagcloud.id_articolo from tagcloud inner join tag on tag.id=tagcloud.id_tag where tag.nome='$tag')

  6. #6
    Utente di HTML.it
    Registrato dal
    Aug 2007
    Messaggi
    250
    grande cacchio! Funziona!!
    Hai ragione, ma ho poca dimestichezza con le JOIN..
    hai un bel tutorial da segnalarmi?

    grazie!!!!

  7. #7
    Guarda io non so perchè ho studiato basi di dati all'università parecchi anni fa quindi ho utilizzato dei testi accademici ma ti consiglio di approfondire l'argomento cercando magari qualche buon testo cartaceo perchè una buona padronanza con il linguaggio sql è importante per la gestione di database importanti, e prima o poi ti capiterà di doverci combattere un po'.

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