<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Code et ornithorynques insectes &#187; SQL</title>
	<atom:link href="http://www.eiodal.com/category/sql/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.eiodal.com</link>
	<description>Un blog utilisant très probablement WordPress</description>
	<lastBuildDate>Wed, 16 Dec 2009 11:21:02 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>SQL : Insert ou update dans une seule et même requête</title>
		<link>http://www.eiodal.com/insert-update-une-seule-requete/</link>
		<comments>http://www.eiodal.com/insert-update-une-seule-requete/#comments</comments>
		<pubDate>Thu, 18 Jun 2009 11:11:27 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[SQL]]></category>
		<category><![CDATA[on duplicate key]]></category>

		<guid isPermaLink="false">http://www.eiodal.com/?p=61</guid>
		<description><![CDATA[Dans une application web on peut avoir besoin de modifier un enregistrement si il existe, ou de le créer si il n&#8217;existe pas.
La première chose qui viens à l&#8217;esprit est d&#8217;effectuer cela en deux requêtes : un &#171;&#160;SELECT&#160;&#187; pour savoir si l&#8217;enregistrement est présent, puis un &#171;&#160;INSERT&#160;&#187; ou un &#171;&#160;UPDATE&#160;&#187; en fonction du résultat. C&#8217;est [...]<p>Source : <a href="http://www.eiodal.com">Blog cakephp, sql, seo, hébergements, improbabilités</a><br/><br/><a href="http://www.eiodal.com/insert-update-une-seule-requete/">SQL : Insert ou update dans une seule et même requête</a></p>
]]></description>
			<content:encoded><![CDATA[<p>Dans une application web on peut avoir besoin de <strong>modifier un enregistrement si il existe</strong>, ou de <strong>le créer si il n&#8217;existe pas</strong>.</p>
<p>La première chose qui viens à l&#8217;esprit est d&#8217;effectuer cela en deux requêtes : un &laquo;&nbsp;SELECT&nbsp;&raquo; pour savoir si l&#8217;enregistrement est présent, puis un &laquo;&nbsp;INSERT&nbsp;&raquo; ou un &laquo;&nbsp;UPDATE&nbsp;&raquo; en fonction du résultat. C&#8217;est un peu lourd pour une requête basique comme celle-ci.</p>
<p>Mais bien sûr notre ami SQL à tout prévu, et on peut réaliser cela en une malheureuse requête grâce à la clause <strong>&laquo;&nbsp;ON DUPLICATE KEY&nbsp;&raquo;</strong>.</p>
<p><span id="more-61"></span></p>
<h3>Le contexte</h3>
<p>Fermez les yeux et imaginez &#8230; Un site ou l&#8217;on doit enregistrer l&#8217;adresse ip et le nom du navigateur de chaque visiteurs avec la date de dernière connexion à la page. On va faire un &laquo;&nbsp;INSERT&nbsp;&raquo; avec toutes les infos la première fois que le visiteur va se connecter. Mais à ses prochaines connexions on va seulement modifier la date de connexion de ce même utilisateur, l&#8217;ip et le navigateur resterons les mêmes (sauf si il en change, ok).</p>
<h3>La table</h3>
<p>Dans un premier temps on créé une table &laquo;&nbsp;users&nbsp;&raquo; avec les champs :  id | ip | navigateur | date .</p>
<p>Ensuite le point le plus important : on mets un <strong>index &laquo;&nbsp;UNIQUE&nbsp;&raquo;</strong> sur les champs &laquo;&nbsp;ip&nbsp;&raquo; et &laquo;&nbsp;navigateur&nbsp;&raquo;. C&#8217;est cela qui va permettre de savoir si on fait un update ou un insert.</p>
<h3>La requête</h3>
<p>Lorsque le visiteur passe sur la page on exécute cette requête  (en admettent le fait que dans la variable $ip se trouve l&#8217;adresse ip de la personne et dans $nav le nom du navigateur) :</p>
<pre class="brush: sql;">
INSERT INTO users
(id, ip, navigateur, date)
VALUES ($ip, $nav, NOW())
ON DUPLICATE KEY UPDATE date = NOW()
</pre>
<p>La requête va enregistrer l&#8217;adresse ip ($ip) avec la date de connexion (NOW()) si la combinaison ip/navigateur n&#8217;existe pas déjà. Si cette combinaison existe elle va simplement modifier la valeur du champs &laquo;&nbsp;date&nbsp;&raquo;.</p>
<p>Source : <a href="http://www.eiodal.com">Blog cakephp, sql, seo, hébergements, improbabilités</a><br/><br/><a href="http://www.eiodal.com/insert-update-une-seule-requete/">SQL : Insert ou update dans une seule et même requête</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.eiodal.com/insert-update-une-seule-requete/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>SQL : Plusieurs &#171;&#160;Count&#160;&#187; dans une requete</title>
		<link>http://www.eiodal.com/sql-plusieurs-count-dans-une-requete/</link>
		<comments>http://www.eiodal.com/sql-plusieurs-count-dans-une-requete/#comments</comments>
		<pubDate>Sun, 07 Jun 2009 17:52:28 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[CakePHP]]></category>
		<category><![CDATA[SQL]]></category>

		<guid isPermaLink="false">http://www.eiodal.com/?p=8</guid>
		<description><![CDATA[Il peut arriver que vous ayez besoin lors d&#8217;une requête SQL de compter le nombre de lignes suivant plusieurs paramètres. Ce n&#8217;est pas possible avec un simple &#171;&#160;COUNT&#160;&#187; il va donc falloir être plus subtile.

Imaginons que l&#8217;on a une table de la forme :



id
statut
nom


1
0
aaaaaaaa


2
1
bbbbbbb


3
0
ccccccc


4
2
dddddd


5
1
eeeeee


6
1
fffffffff



Pour connaitre le nombre de lignes où le statut est à 0, [...]<p>Source : <a href="http://www.eiodal.com">Blog cakephp, sql, seo, hébergements, improbabilités</a><br/><br/><a href="http://www.eiodal.com/sql-plusieurs-count-dans-une-requete/">SQL : Plusieurs &laquo;&nbsp;Count&nbsp;&raquo; dans une requete</a></p>
]]></description>
			<content:encoded><![CDATA[<p>Il peut arriver que vous ayez besoin lors d&#8217;une requête SQL de <strong>compter le nombre de lignes suivant plusieurs paramètres</strong>. Ce n&#8217;est pas possible avec un simple &laquo;&nbsp;COUNT&nbsp;&raquo; il va donc falloir être plus subtile.</p>
<p><span id="more-8"></span></p>
<p>Imaginons que l&#8217;on a une table de la forme :</p>
<table class="table_sql" border="0">
<tbody>
<tr>
<th>id</th>
<th>statut</th>
<th>nom</th>
</tr>
<tr>
<td>1</td>
<td>0</td>
<td>aaaaaaaa</td>
</tr>
<tr>
<td>2</td>
<td>1</td>
<td>bbbbbbb</td>
</tr>
<tr>
<td>3</td>
<td>0</td>
<td>ccccccc</td>
</tr>
<tr>
<td>4</td>
<td>2</td>
<td>dddddd</td>
</tr>
<tr>
<td>5</td>
<td>1</td>
<td>eeeeee</td>
</tr>
<tr>
<td>6</td>
<td>1</td>
<td>fffffffff</td>
</tr>
</tbody>
</table>
<p>Pour connaitre le nombre de lignes où le statut est à 0, un COUNT classique suffit :</p>
<pre class="brush: sql;">SELECT COUNT(id) FROM table WHERE statut = 0;</pre>
<p>Cette requête va simplement compter le nombre de ligne où le champ &laquo;&nbsp;statut&nbsp;&raquo; est à 0, et va renvoyer 2 dans notre cas.</p>
<p>Mais comment faire si on veut compter le nombre de lignes où le statut est égale à 0, mais aussi à 1 et 2, tout ça dans la même requête ? Et bien il faut utiliser une structure conditionnelle pardi. C&#8217;est du SQL donc ça marche aussi bien avec MySQL que PostgreSQL ou autres.</p>
<pre class="brush: sql;">
SELECT
SUM(CASE statut WHEN 0 THEN 1 ELSE 0 END),
SUM(CASE statut WHEN 1 THEN 1 ELSE 0 END),
SUM(CASE statut WHEN 2 THEN 1 ELSE 0 END)
FROM table
GROUP BY statut
</pre>
<p>Cette requête va nous renvoyer le nombre de lignes qui ont un statut à 0, puis 1 et 2. Attention à bien utiliser un &laquo;&nbsp;GROUP By&nbsp;&raquo; autrement les résultats renvoyés vont être faussés.</p>
<p>Avec CakePHP ça va s&#8217;écrire comme ça :</p>
<pre class="brush: php;">
$this-&gt;Model-&gt;find('all', array(
'fields' =&gt; array(
'SUM(CASE Model.statut WHEN 0 THEN 1 ELSE 0 END)',
'SUM(CASE Model.statut WHEN 1 THEN 1 ELSE 0 END)',
'SUM(CASE Model.statut WHEN 2 THEN 1 ELSE 0 END)',
),
'group' =&gt; array('Model.statut'),
));
</pre>
<p>En esperant que ça aide !</p>
<p>Source : <a href="http://www.eiodal.com">Blog cakephp, sql, seo, hébergements, improbabilités</a><br/><br/><a href="http://www.eiodal.com/sql-plusieurs-count-dans-une-requete/">SQL : Plusieurs &laquo;&nbsp;Count&nbsp;&raquo; dans une requete</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.eiodal.com/sql-plusieurs-count-dans-une-requete/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
