<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2italianfull.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss version="2.0">
<channel>
 <title><![CDATA[Il Blog di Francesco Terenzani]]></title>
 <link>http://www.terenzani.it/</link>
 <description />
 <language>it-it</language>
 <pubDate>Sun, 05 Feb 2012 19:14:21 +0100</pubDate>
  <atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/t-lab" /><feedburner:info xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" uri="t-lab" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><feedburner:emailServiceId xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0">t-lab</feedburner:emailServiceId><feedburner:feedburnerHostname xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0">http://feedburner.google.com</feedburner:feedburnerHostname><item>
   <title>Utilizzare sfForm (ed ogni classe di Symfony 1.x) come componente standalone</title>
   <link>http://www.terenzani.it/61/symfony-standalone</link>
   <guid isPermaLink="false">www.terenzani.it:post:61</guid>
   <pubDate>Tue, 06 Sep 2011 23:41:40 +0200</pubDate>
   <description>&lt;p&gt;
	Oltre ai &lt;a href="http://components.symfony-project.org/" target="_blank"&gt;componenti di Symfony&lt;/a&gt; gi&amp;agrave; distribuiti come libraries standalone, se vi interessa utilizzate solo qualche classe del Framework Symfony 1 senza portarvi appresso tutta l&amp;#39;architettura MVC, basta includere e registrare il suo core autoloader:&lt;/p&gt;
&lt;pre&gt;
&amp;lt;?php
require_once &amp;#39;/path/to/Symfony/autoload/sfCoreAutoload.class.php&amp;#39;;
sfCoreAutoload::register();&lt;/pre&gt;
&lt;p&gt;
	Si pu&amp;ograve; ora utilizzare solo il &lt;a href="http://www.symfony-project.org/forms/1_4/en/" target="_blank"&gt;framework per i form di Symfony&lt;/a&gt;, ma anche ogni altra classe di Symfony. Qualche esempio riferito a Symfony 1.1 &lt;a href="http://symfony.com/blog/the-symfony-1-1-architecture" target="_blank"&gt;sul blog ufficiale&lt;/a&gt;.&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/t-lab?a=zieTlU89aak:2lt4ksBoKT0:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/t-lab?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/t-lab?a=zieTlU89aak:2lt4ksBoKT0:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/t-lab?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/t-lab?a=zieTlU89aak:2lt4ksBoKT0:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/t-lab?i=zieTlU89aak:2lt4ksBoKT0:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/t-lab?a=zieTlU89aak:2lt4ksBoKT0:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/t-lab?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/t-lab?a=zieTlU89aak:2lt4ksBoKT0:GLSgKK_ckEE"&gt;&lt;img src="http://feeds.feedburner.com/~ff/t-lab?i=zieTlU89aak:2lt4ksBoKT0:GLSgKK_ckEE" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description>
 </item>
  <item>
   <title>[Web Performance] Includere file Javascript alla fine del body: problemi e soluzioni</title>
   <link>http://www.terenzani.it/56/inclusione-file-javascript-alla-fine-del-body</link>
   <guid isPermaLink="false">www.terenzani.it:post:56</guid>
   <pubDate>Tue, 26 Oct 2010 23:32:00 +0200</pubDate>
   <description>&lt;p&gt;
	Una delle &lt;em&gt;performance best practices&lt;/em&gt; per le pagine web &amp;egrave; quella di includere i richiami dei file Javascript alla fine del documento, appena prima della chiusura del tag body, invece che, come ancora comunemente avviene, nell&amp;#39;head del documento.&lt;/p&gt;
&lt;p&gt;
	Una delle &lt;em&gt;scomodit&amp;agrave;&lt;/em&gt; che questo comporta &amp;egrave; che, se ad esempio spostiamo jQuery alla fine del documento, naturalmente non potremo utilizzare la libreria in nessuno script &lt;em&gt;embed&lt;/em&gt; prima della fine del documento.&lt;/p&gt;
&lt;p&gt;
	Un modo molto semplice per aggirare il problema, &amp;egrave; quella di utilizzare un semplice array come coda di funzioni da eseguire quando le librerie necessarie saranno state incluse.&lt;/p&gt;
&lt;p&gt;
	Nell&amp;#39;head del documento, l&amp;#39;unico Javascript pu&amp;ograve; quindi essere:&lt;/p&gt;
&lt;pre&gt;
&amp;lt;script&amp;gt;var jq=[]&amp;lt;/script&amp;gt;&lt;/pre&gt;
&lt;p&gt;
	Ora, se vogliamo definire uno script embed nella pagina, ci basta aggiungere una funzione come elemento dell&amp;#39;array:&lt;/p&gt;
&lt;pre&gt;
&amp;lt;script&amp;gt;
jq.push(function($){
    alert(&amp;quot;jQuery is here and the document is ready&amp;quot;);
});
&amp;lt;/script&amp;gt;&lt;/pre&gt;
&lt;p&gt;
	Ed infine, a fondo pagina, dopo l&amp;#39;inclusione delle librerie, non ci resta che eseguire la coda di funzioni. Se abbiamo a disposizione jQuery:&lt;/p&gt;
&lt;pre&gt;
jQuery(function($){
    $.each(jq, function() {
        this($);
    });
    jq.push = function(func) {func($)};
});&lt;/pre&gt;
&lt;p&gt;
	O, per una versione generica in puro Javascript:&lt;/p&gt;
&lt;pre&gt;
for (var i = 0, length = jq.length; i &amp;lt; length; ++i) {
    jq[i]();
}
jq.push = function(func) {func()};&lt;/pre&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/t-lab?a=HAdxCfOxrJM:rKsYg0Lf37E:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/t-lab?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/t-lab?a=HAdxCfOxrJM:rKsYg0Lf37E:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/t-lab?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/t-lab?a=HAdxCfOxrJM:rKsYg0Lf37E:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/t-lab?i=HAdxCfOxrJM:rKsYg0Lf37E:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/t-lab?a=HAdxCfOxrJM:rKsYg0Lf37E:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/t-lab?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/t-lab?a=HAdxCfOxrJM:rKsYg0Lf37E:GLSgKK_ckEE"&gt;&lt;img src="http://feeds.feedburner.com/~ff/t-lab?i=HAdxCfOxrJM:rKsYg0Lf37E:GLSgKK_ckEE" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description>
 </item>
  <item>
   <title>Tracciare link esterni, e-mail e download con Google Analytics</title>
   <link>http://www.terenzani.it/57/tracciare-link-esterni-e-mail-e-download-con-google-analytics</link>
   <guid isPermaLink="false">www.terenzani.it:post:57</guid>
   <pubDate>Tue, 09 Feb 2010 12:37:56 +0100</pubDate>
   <description>&lt;p&gt;
	Ci sono diversi modi per tracciare i click sui link esterni, le e-mail ed i file da scaricare. Tra le tante, ce ne &amp;egrave; una particolarmente &lt;strong&gt;semplice&lt;/strong&gt; e soprattutto &lt;strong&gt;automatica&lt;/strong&gt;, che &amp;egrave; quella realizzata da me e &lt;strong&gt;Marco Cilia&lt;/strong&gt; di &lt;a href="http://www.goanalytics.info/" target="_blank"&gt;Goanalytics&lt;/a&gt; :-)&lt;/p&gt;
&lt;p&gt;
	L&amp;#39;installazione e la configurazione &amp;egrave; in soli due passi:&lt;/p&gt;
&lt;ol&gt;
	&lt;li&gt;
		&lt;a href="http://www.terenzani.it/toys/ga.link/ga.link.min.js" target="_blank"&gt;Scarica la libreria&lt;/a&gt; e salvala nella cartella /js/ (se non esiste creala) del tuo sito web&lt;br /&gt;
		&amp;nbsp;&lt;/li&gt;
	&lt;li&gt;
		Includi in tutte le pagine del tuo sito, appena &lt;strong&gt;dopo&lt;/strong&gt; il codice di Google Analytics, questo codice:&lt;br /&gt;
		&lt;pre&gt;
&amp;lt;script src=&amp;quot;/js/ga.link.min.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;script&amp;gt;
_gaq.push(function(){
    _ftTrack(_gat._getTrackerByName(), &amp;quot;link|email|7z|aac|avi|csv|doc|exe|flv|gif|gz|jpe?g|js|mp(3|4|e?g)|mov|pdf|phps|png|ppt|rar|sit|tar|torrent|txt|wma|wmv|xls|xml|zip&amp;quot;);
});
&amp;lt;/script&amp;gt;
&lt;/pre&gt;
	&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;
	&lt;strong&gt;Fine&lt;/strong&gt; dell&amp;#39;installazione! :-)&lt;br /&gt;
	Ora tutti i click su link esterni, e-mail e file scaricabili saranno tracciati come &lt;strong&gt;eventi&lt;/strong&gt; in Google Analytics.&lt;/p&gt;
&lt;p&gt;
	Il codice completo dovrebbe essere pi&amp;ugrave; o meno come il seguente:&lt;/p&gt;
&lt;pre&gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;

  var _gaq = _gaq || [];
  _gaq.push([&amp;#39;_setAccount&amp;#39;, &amp;#39;UA-XXXXX-X&amp;#39;]);
  _gaq.push([&amp;#39;_trackPageview&amp;#39;]);

  (function() {
    var ga = document.createElement(&amp;#39;script&amp;#39;); ga.type = &amp;#39;text/javascript&amp;#39;; ga.async = true;
    ga.src = (&amp;#39;https:&amp;#39; == document.location.protocol ? &amp;#39;https://ssl&amp;#39; : &amp;#39;http://www&amp;#39;) + &amp;#39;.google-analytics.com/ga.js&amp;#39;;
    var s = document.getElementsByTagName(&amp;#39;script&amp;#39;)[0]; s.parentNode.insertBefore(ga, s);
  })();

&amp;lt;/script&amp;gt;
&amp;lt;script src=&amp;quot;/js/ga.link.min.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;script&amp;gt;
_gaq.push(function(){
    _ftTrack(_gat._getTrackerByName(), &amp;quot;link|email|7z|aac|avi|csv|doc|exe|flv|gif|gz|jpe?g|js|mp(3|4|e?g)|mov|pdf|phps|png|ppt|rar|sit|tar|torrent|txt|wma|wmv|xls|xml|zip&amp;quot;);
});
&amp;lt;/script&amp;gt;&lt;/pre&gt;
&lt;p&gt;
	La funzione _ftTrack accetta due argomenti:&lt;/p&gt;
&lt;ol&gt;
	&lt;li&gt;
		&lt;strong&gt;Il primo&lt;/strong&gt;, quello che rende la libreria multi account, &amp;egrave; il tracker di Google Analytics, ottenuto con la funzione &lt;code&gt;_gat._getTrackerByName()&lt;/code&gt;&lt;br /&gt;
		&amp;nbsp;&lt;/li&gt;
	&lt;li&gt;
		&lt;strong&gt;Il secondo&lt;/strong&gt; &amp;egrave; composto dalla parola chiave &amp;quot;link&amp;quot;, che attiva il tracciamento dei link esterni, dalla parola chiave &amp;quot;email&amp;quot;, che attiva il tracciamento dei click sulle e-mail e dall&amp;rsquo;elenco delle estensioni da tracciare. Le parole chiave ed ogni estensione devono essere separate tra loro da un pipe (il carattere &amp;quot;|&amp;quot;).&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;
	Tracciamento su pi&amp;ugrave; account&lt;/h2&gt;
&lt;p&gt;
	Una delle particolarit&amp;agrave; di questa libreria &amp;egrave; che pu&amp;ograve; essere utilizzata anche con diversi account di Google Analytics nella stessa pagina. Di seguito un esempio con due account:&lt;/p&gt;
&lt;p&gt;
	&lt;strong&gt;Il codice di Google Analytics:&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;

  var _gaq = _gaq || [];
  _gaq.push([&amp;#39;_setAccount&amp;#39;, &amp;#39;UA-XXXXX-1&amp;#39;]);
  _gaq.push([&amp;#39;_trackPageview&amp;#39;]);

  _gaq.push([&amp;#39;b._setAccount&amp;#39;, &amp;#39;UA-XXXXX-2&amp;#39;]);
  _gaq.push([&amp;#39;b._trackPageview&amp;#39;]);

  (function() {
    var ga = document.createElement(&amp;#39;script&amp;#39;); ga.type = &amp;#39;text/javascript&amp;#39;; ga.async = true;
    ga.src = (&amp;#39;https:&amp;#39; == document.location.protocol ? &amp;#39;https://ssl&amp;#39; : &amp;#39;http://www&amp;#39;) + &amp;#39;.google-analytics.com/ga.js&amp;#39;;
    var s = document.getElementsByTagName(&amp;#39;script&amp;#39;)[0]; s.parentNode.insertBefore(ga, s);
  })();

&amp;lt;/script&amp;gt;&lt;/pre&gt;
&lt;p&gt;
	&lt;strong&gt;Seguito da:&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;
&amp;lt;script src=&amp;quot;/js/ga.link.min.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;script&amp;gt;
_gaq.push(function(){
    _ftTrack(_gat._getTrackerByName(), &amp;quot;link&amp;quot;);
    _ftTrack(_gat._getTrackerByName(&amp;#39;b&amp;#39;), &amp;quot;7z|aac|avi|csv|doc|exe|flv|gif|gz|jpe?g|js|mp(3|4|e?g)|mov|pdf|phps|png|ppt|rar|sit|tar|torrent|txt|wma|wmv|xls|xml|zip&amp;quot;);
});
&amp;lt;/script&amp;gt;&lt;/pre&gt;
&lt;p&gt;
	Vi invito a leggere anche questro &lt;a href="http://www.goanalytics.info/tracciare-automaticamente-link-e-download-the-italian-way/"&gt;post di Marco&lt;/a&gt; con un&amp;#39;altro esempio di tracciamento su due account.&lt;/p&gt;
&lt;h2&gt;
	Tracciamento con il vecchio snippet di Google Analytics&lt;/h2&gt;
&lt;p&gt;
	Il funzionamento &amp;egrave; praticamente lo stesso, ma questa volta invece di utilizzare _gat._getTrackerByName(), utilizza la variabile pageTracker come nel seguente esempio:&lt;/p&gt;
&lt;pre&gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;
var gaJsHost = ((&amp;quot;https:&amp;quot; == document.location.protocol) ? &amp;quot;https://ssl.&amp;quot; : &amp;quot;http://www.&amp;quot;);
document.write(unescape(&amp;quot;%3Cscript src=&amp;#39;&amp;quot; + gaJsHost + &amp;quot;google-analytics.com/ga.js&amp;#39; type=&amp;#39;text/javascript&amp;#39;%3E%3C/script%3E&amp;quot;));
&amp;lt;/script&amp;gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;
var pageTracker = _gat._getTracker(&amp;quot;UA-XXXXX-X&amp;quot;);
pageTracker._trackPageview();
&amp;lt;/script&amp;gt;
&lt;/pre&gt;
&lt;pre&gt;
&lt;strong&gt;&amp;lt;script src=&amp;quot;/js/ga.link.min.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;script&amp;gt;
_ftTrack(pageTracker, &amp;quot;link|email|zip&amp;quot;);
&amp;lt;/script&amp;gt;&lt;/strong&gt;&lt;/pre&gt;
&lt;p&gt;
	&amp;nbsp;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/t-lab?a=_oKFBaKQpGM:O-e2lKQoBQE:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/t-lab?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/t-lab?a=_oKFBaKQpGM:O-e2lKQoBQE:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/t-lab?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/t-lab?a=_oKFBaKQpGM:O-e2lKQoBQE:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/t-lab?i=_oKFBaKQpGM:O-e2lKQoBQE:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/t-lab?a=_oKFBaKQpGM:O-e2lKQoBQE:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/t-lab?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/t-lab?a=_oKFBaKQpGM:O-e2lKQoBQE:GLSgKK_ckEE"&gt;&lt;img src="http://feeds.feedburner.com/~ff/t-lab?i=_oKFBaKQpGM:O-e2lKQoBQE:GLSgKK_ckEE" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description>
 </item>
  <item>
   <title>Query SQL per un sistema di catalogazione tramite "Tagging"</title>
   <link>http://www.terenzani.it/34/query-sql-per-un-sistema-di-catalogazione-tramite-tagging</link>
   <guid isPermaLink="false">www.terenzani.it:post:34</guid>
   <pubDate>Wed, 21 Jun 2006 22:54:00 +0200</pubDate>
   <description>&lt;h2&gt;
	Introduzione ai tag&lt;/h2&gt;
&lt;p&gt;
	La catalogazione tramite tag, con i suoi pregi, i suoi difetti, i suoi limiti e le sue potenzialit&amp;agrave; sta molto emergendo con l&amp;#39;avvento del cos&amp;igrave; detto Web 2.0, ed &amp;egrave; sempre pi&amp;ugrave; spesso il sistema adottato dai blog e dai sistemi di catalogazione folksonomica. La differenza concettuale di una catalogazione a tag rispetto ad una pi&amp;ugrave; &amp;quot;tradizionale&amp;quot;, &amp;egrave; che in questo tipo di catalogazione non ci sono gerarchie, ma relazioni. Ma qual&amp;#39;&amp;egrave; la struttura di un database non gerarchico? E come si possono ricavarne relazioni? In questo articolo, dal taglio molto pratico, cercheremo di introdurre questo argomento.&lt;/p&gt;
&lt;h2&gt;
	Sommario:&lt;/h2&gt;
&lt;ul&gt;
	&lt;li&gt;
		&lt;a href="#tabelle"&gt;Le tabelle&lt;/a&gt;.&lt;/li&gt;
	&lt;li&gt;
		&lt;a href="#tag-assoc"&gt;Tag associati al contenuto&lt;/a&gt;.&lt;/li&gt;
	&lt;li&gt;
		&lt;a href="#cont-assoc"&gt;Contenuti associati ai tag&lt;/a&gt;.&lt;/li&gt;
	&lt;li&gt;
		&lt;a href="#rel-tag"&gt;Tag correlati&lt;/a&gt;.&lt;/li&gt;
	&lt;li&gt;
		&lt;a href="#rel-cont"&gt;Contenuti correlati&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="tabelle"&gt;
	Le tabelle&lt;/h2&gt;
&lt;p&gt;
	Semplificando, una struttura di tabelle di database per gestire una catalogazione tramite tag potrebbe essere come la seguente. La tabella &lt;strong&gt;posts&lt;/strong&gt;, con i contenuti da catalogare:&lt;/p&gt;
&lt;table border="1" cellpadding="5" cellspacing="2"&gt;
	&lt;tbody&gt;
		&lt;tr&gt;
			&lt;th scope="col"&gt;
				post_id&lt;/th&gt;
			&lt;th scope="col"&gt;
				content&lt;/th&gt;
		&lt;/tr&gt;
		&lt;tr&gt;
			&lt;td scope="row"&gt;
				1&lt;/td&gt;
			&lt;td&gt;
				Un post su SQL, tags e PHP.&lt;/td&gt;
		&lt;/tr&gt;
		&lt;tr&gt;
			&lt;td scope="row"&gt;
				2&lt;/td&gt;
			&lt;td&gt;
				Un post su come creare una nuvola di tag con PHP e CSS.&lt;/td&gt;
		&lt;/tr&gt;
		&lt;tr&gt;
			&lt;td scope="row"&gt;
				3&lt;/td&gt;
			&lt;td&gt;
				Un menu carino con i CSS...&lt;/td&gt;
		&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;
	La tabella &lt;strong&gt;tags&lt;/strong&gt;, con l&amp;#39;elenco dei tag utilizzati:&lt;/p&gt;
&lt;table border="1" cellpadding="5" cellspacing="2"&gt;
	&lt;tbody&gt;
		&lt;tr&gt;
			&lt;th scope="col"&gt;
				tag_id&lt;/th&gt;
			&lt;th scope="col"&gt;
				tag&lt;/th&gt;
		&lt;/tr&gt;
		&lt;tr&gt;
			&lt;td scope="row"&gt;
				1&lt;/td&gt;
			&lt;td&gt;
				SQL&lt;/td&gt;
		&lt;/tr&gt;
		&lt;tr&gt;
			&lt;td scope="row"&gt;
				2&lt;/td&gt;
			&lt;td&gt;
				PHP&lt;/td&gt;
		&lt;/tr&gt;
		&lt;tr&gt;
			&lt;td scope="row"&gt;
				3&lt;/td&gt;
			&lt;td&gt;
				Tags&lt;/td&gt;
		&lt;/tr&gt;
		&lt;tr&gt;
			&lt;td scope="row"&gt;
				4&lt;/td&gt;
			&lt;td&gt;
				CSS&lt;/td&gt;
		&lt;/tr&gt;
		&lt;tr&gt;
			&lt;td scope="row"&gt;
				5&lt;/td&gt;
			&lt;td&gt;
				Menu&lt;/td&gt;
		&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;
	La tabella &lt;strong&gt;posts2tags&lt;/strong&gt; che mette in relazioni i post con i relativi tag associati:&lt;/p&gt;
&lt;table border="1" cellpadding="5" cellspacing="2"&gt;
	&lt;tbody&gt;
		&lt;tr&gt;
			&lt;th scope="col"&gt;
				rel_id&lt;/th&gt;
			&lt;th scope="col"&gt;
				post_id&lt;/th&gt;
			&lt;th scope="col"&gt;
				tag_id&lt;/th&gt;
		&lt;/tr&gt;
		&lt;tr&gt;
			&lt;td scope="row"&gt;
				1&lt;/td&gt;
			&lt;td&gt;
				1&lt;/td&gt;
			&lt;td&gt;
				1&lt;/td&gt;
		&lt;/tr&gt;
		&lt;tr&gt;
			&lt;td scope="row"&gt;
				2&lt;/td&gt;
			&lt;td&gt;
				1&lt;/td&gt;
			&lt;td&gt;
				2&lt;/td&gt;
		&lt;/tr&gt;
		&lt;tr&gt;
			&lt;td scope="row"&gt;
				3&lt;/td&gt;
			&lt;td&gt;
				1&lt;/td&gt;
			&lt;td&gt;
				3&lt;/td&gt;
		&lt;/tr&gt;
		&lt;tr&gt;
			&lt;td scope="row"&gt;
				4&lt;/td&gt;
			&lt;td&gt;
				2&lt;/td&gt;
			&lt;td&gt;
				2&lt;/td&gt;
		&lt;/tr&gt;
		&lt;tr&gt;
			&lt;td scope="row"&gt;
				5&lt;/td&gt;
			&lt;td&gt;
				2&lt;/td&gt;
			&lt;td&gt;
				3&lt;/td&gt;
		&lt;/tr&gt;
		&lt;tr&gt;
			&lt;td scope="row"&gt;
				6&lt;/td&gt;
			&lt;td&gt;
				2&lt;/td&gt;
			&lt;td&gt;
				4&lt;/td&gt;
		&lt;/tr&gt;
		&lt;tr&gt;
			&lt;td scope="row"&gt;
				7&lt;/td&gt;
			&lt;td&gt;
				3&lt;/td&gt;
			&lt;td&gt;
				4&lt;/td&gt;
		&lt;/tr&gt;
		&lt;tr&gt;
			&lt;td scope="row"&gt;
				8&lt;/td&gt;
			&lt;td&gt;
				3&lt;/td&gt;
			&lt;td&gt;
				5&lt;/td&gt;
		&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="tag-assoc"&gt;
	Tag associati al contenuto&lt;/h2&gt;
&lt;p&gt;
	Riferendoci alle tabelle appena viste, la query per ricavare i tag associati al post con &lt;code&gt;post_id&lt;/code&gt; uguale ad 1 &amp;egrave;:&lt;/p&gt;
&lt;pre class="code"&gt;
&lt;code&gt;SELECT tags.tag 
FROM posts, tags, posts2tags 
WHERE posts2tags.post_id = posts.post_id 
 AND posts2tags.tag_id = tags.tag_id 
&lt;strong&gt; AND posts2tags.post_id = 1&lt;/strong&gt; 
ORDER BY tags.tag&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id="cont-assoc"&gt;
	Contenuti associati ai tag&lt;/h2&gt;
&lt;p&gt;
	Ricavare i contenuti associati ai tag &amp;egrave; un po&amp;#39; pi&amp;ugrave; complicato, se i tag sono pi&amp;ugrave; di uno. Con la seguente query selezioneremo tutti i post associati al tag &amp;quot;SQL&amp;quot; e &amp;quot;tags&amp;quot;:&lt;/p&gt;
&lt;pre class="code"&gt;
&lt;code&gt;SELECT posts.post_id, posts.content 
FROM posts, tags, posts2tags 
WHERE posts2tags.post_id = posts.post_id 
 AND posts2tags.tag_id = tags.tag_id 
 AND &lt;strong&gt;tags.tag IN (&amp;#39;SQL&amp;#39;, &amp;#39;tags&amp;#39;) 
GROUP BY posts.post_id 
HAVING COUNT( posts2tags.post_id ) = 2&lt;/strong&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;
	Come abbiamo detto, la query seleziona i post associati al tag &lt;em&gt;SQL&lt;/em&gt; o a &lt;em&gt;tags&lt;/em&gt; (&lt;code&gt;tags.tag IN (&amp;#39;SQL&amp;#39;, &amp;#39;tags&amp;#39;)&lt;/code&gt;) e, per restingere la selezione ai post associati ad entrambi i tag, anzich&amp;egrave; ad uno soltanto, seleziona solo i post che appaiono 2 volte (&lt;code&gt;HAVING COUNT( posts2tags.post_id ) = 2&lt;/code&gt;). 2 perch&amp;eacute; i tag sono 2, se i tag fossero stati tre sarebbe stato &lt;code&gt;HAVING COUNT( posts2tags.post_id ) = &lt;strong&gt;3&lt;/strong&gt;&lt;/code&gt; e cos&amp;igrave; via...&lt;/p&gt;
&lt;h2 id="rel-tag"&gt;
	Tag correlati&lt;/h2&gt;
&lt;p&gt;
	Quando si mostrano i post legati ad uno o pi&amp;ugrave; tag, &amp;egrave; tipico mostrare anche i tag correlati a quelli correnti. Per individuarli, una volta selezionati gli &lt;code&gt;ID&lt;/code&gt; dei contenuti (nel nostro caso i &lt;code&gt;post_id&lt;/code&gt;) associati ai tag correnti, come descritto nel punto precedente, si avr&amp;agrave; una query come questa:&lt;/p&gt;
&lt;pre class="code"&gt;
&lt;code&gt;SELECT tags.tag 
FROM tags, posts2tags 
WHERE posts2tags.tag_id = tags.tag_id 
 AND &lt;strong&gt;posts2tags.post_id IN (1,2) 
 AND tags.tag NOT IN (&amp;#39;SQL&amp;#39;,&amp;#39;tags&amp;#39;)&lt;/strong&gt; 
&lt;/code&gt;&lt;code&gt;GROUP BY posts2tags.tag_id &lt;/code&gt;
&lt;code&gt;ORDER BY tags.tag&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;
	La query seleziona tutti i tag associati ai contenuti correnti (i post con &lt;code&gt;post_id&lt;/code&gt; 1 e 2, in questo caso) escludento i tag &amp;quot;SQL&amp;quot; e &amp;quot;tags&amp;quot;, dato che, essendo i tag correnti, sarebbe inutile mostrarli come tag correlati. DISTINCT serve per eliminare i &amp;quot;dopioni&amp;quot; ed avere solo l&amp;#39;elenco dei tag diversi tra loro.&lt;/p&gt;
&lt;h2 id="rel-cont"&gt;
	Contenuti correlati&lt;/h2&gt;
&lt;p&gt;
	Per selezionare i contenuti che hanno pi&amp;ugrave; tag in comune con il contenuto corrente si pu&amp;ograve; utilizzare una query come questa:&lt;/p&gt;
&lt;pre class="code"&gt;
&lt;code&gt;SELECT posts.*, &lt;strong&gt;count(posts2tags.post_id) as num&lt;/strong&gt; 
FROM posts, tags, posts2tags 
WHERE posts2tags.post_id = posts.post_id 
 AND posts2tags.tag_id = tags.tag_id 
 AND tags.tag IN (&amp;#39;SQL&amp;#39;,&amp;#39;tags&amp;#39;) 
&lt;strong&gt; AND posts.post_id != 1&lt;/strong&gt; 
GROUP BY posts2tags.post_id 
&lt;strong&gt;ORDER BY num DESC&lt;/strong&gt;, content DESC&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;
	Con questa query abbiamo ottenuto i post ordinati in base al numero di tag in comune con il post corrente (quello con &lt;code&gt;post_id&lt;/code&gt; uguale ad 1, in questo caso).&lt;/p&gt;
&lt;h2&gt;
	Ottimizzazione&lt;/h2&gt;
&lt;p&gt;
	Per ottimizzare lo schema o vederne di alternativi, potete far riferimento all&amp;#39;articolo sul Wiki MySQL Forge: &lt;a href="http://forge.mysql.com/wiki/TagSchema"&gt;TagSchema&lt;/a&gt;, in particolare alla sezione &lt;a href="http://forge.mysql.com/wiki/TagSchema#Recommended_Architecture"&gt;Recommended Architecture&lt;/a&gt;.&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/t-lab?a=UBevOBSPiKo:1p71ekOuYLI:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/t-lab?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/t-lab?a=UBevOBSPiKo:1p71ekOuYLI:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/t-lab?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/t-lab?a=UBevOBSPiKo:1p71ekOuYLI:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/t-lab?i=UBevOBSPiKo:1p71ekOuYLI:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/t-lab?a=UBevOBSPiKo:1p71ekOuYLI:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/t-lab?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/t-lab?a=UBevOBSPiKo:1p71ekOuYLI:GLSgKK_ckEE"&gt;&lt;img src="http://feeds.feedburner.com/~ff/t-lab?i=UBevOBSPiKo:1p71ekOuYLI:GLSgKK_ckEE" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description>
 </item>
 </channel>
</rss>

