<?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>Josh Duff &#187; MySQL</title>
	<atom:link href="http://joshduff.com/category/geekery/mysql/feed" rel="self" type="application/rss+xml" />
	<link>http://joshduff.com</link>
	<description>A guy with a web site</description>
	<lastBuildDate>Sat, 21 Aug 2010 22:28:04 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
		<item>
		<title>MySQL wrapper class (PHP)</title>
		<link>http://joshduff.com/232/mysql-wrapper-class-php</link>
		<comments>http://joshduff.com/232/mysql-wrapper-class-php#comments</comments>
		<pubDate>Mon, 26 Jul 2010 23:07:46 +0000</pubDate>
		<dc:creator>Josh</dc:creator>
				<category><![CDATA[MySQL]]></category>
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://joshduff.com/?p=232</guid>
		<description><![CDATA[I&#039;m not saying that this is the best implementation of a MySQL wrapper class for PHP. I&#039;m not advocating its use in production code. However, this is what I&#039;ve used in most scripts I&#039;ve thrown together in the last few years &#8211; I hate having to throw a mysql_error call after every query, y&#039;know? &#60;?php [...]]]></description>
			<content:encoded><![CDATA[<p>I&#039;m not saying that this is the best implementation of a MySQL wrapper class for PHP.  I&#039;m not advocating its use in production code.</p>
<p>However, this is what I&#039;ve used in most scripts I&#039;ve thrown together in the last few years &#8211; I hate having to throw a mysql_error call after every query, y&#039;know?</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?php</span>
&nbsp;
<span style="color: #990000;">define</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'CLIENT_LONG_PASSWORD'</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">1</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">class</span> MySQLWrapper
<span style="color: #009900;">&#123;</span>
	<span style="color: #000000; font-weight: bold;">var</span> <span style="color: #000088;">$server_port</span>	<span style="color: #339933;">=</span>		<span style="color: #0000ff;">'localhost:3306'</span><span style="color: #339933;">;</span>
	<span style="color: #000000; font-weight: bold;">var</span> <span style="color: #000088;">$database</span> 		<span style="color: #339933;">=</span>		<span style="color: #0000ff;">'whatever'</span><span style="color: #339933;">;</span>
	<span style="color: #000000; font-weight: bold;">var</span> <span style="color: #000088;">$username</span> 		<span style="color: #339933;">=</span>		<span style="color: #0000ff;">'a username'</span><span style="color: #339933;">;</span>
	<span style="color: #000000; font-weight: bold;">var</span> <span style="color: #000088;">$password</span> 		<span style="color: #339933;">=</span>		<span style="color: #0000ff;">'a password'</span><span style="color: #339933;">;</span>
	<span style="color: #000000; font-weight: bold;">var</span> <span style="color: #000088;">$force_long_password</span> <span style="color: #339933;">=</span> <span style="color: #009900; font-weight: bold;">false</span><span style="color: #339933;">;</span>
	<span style="color: #000000; font-weight: bold;">var</span> <span style="color: #000088;">$db_object</span><span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">function</span> __construct<span style="color: #009900;">&#40;</span><span style="color: #000088;">$server_port</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;&quot;</span><span style="color: #339933;">,</span> <span style="color: #000088;">$database</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;&quot;</span><span style="color: #339933;">,</span> <span style="color: #000088;">$username</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;&quot;</span><span style="color: #339933;">,</span> <span style="color: #000088;">$password</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;&quot;</span><span style="color: #339933;">,</span> <span style="color: #000088;">$force_long_password</span> <span style="color: #339933;">=</span> <span style="color: #009900; font-weight: bold;">false</span><span style="color: #009900;">&#41;</span>
	<span style="color: #009900;">&#123;</span>
		<span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">server_port</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$server_port</span><span style="color: #339933;">;</span>
		<span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">database</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$database</span><span style="color: #339933;">;</span>
		<span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">username</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$username</span><span style="color: #339933;">;</span>
		<span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">password</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$password</span><span style="color: #339933;">;</span>
		<span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">force_long_password</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$force_long_password</span><span style="color: #339933;">;</span>
&nbsp;
		<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">server_port</span> <span style="color: #339933;">!=</span> <span style="color: #0000ff;">&quot;&quot;</span><span style="color: #009900;">&#41;</span>
		<span style="color: #009900;">&#123;</span>
			<span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">Connect</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">function</span> Connect<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
	<span style="color: #009900;">&#123;</span>
		<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #990000;">isset</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">db_object</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span>
		<span style="color: #009900;">&#123;</span>
			<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span><span style="color: #990000;">mysql_ping</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">db_object</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span>
			<span style="color: #009900;">&#123;</span>
				<span style="color: #990000;">unset</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">db_object</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
				<span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">Connect</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
			<span style="color: #009900;">&#125;</span>
		<span style="color: #009900;">&#125;</span>
		<span style="color: #b1b100;">else</span>
		<span style="color: #009900;">&#123;</span>
			<span style="color: #000088;">$db_object</span> <span style="color: #339933;">=</span> <span style="color: #990000;">mysql_connect</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">server_port</span><span style="color: #339933;">,</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">username</span><span style="color: #339933;">,</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">password</span><span style="color: #339933;">,</span> <span style="color: #009900; font-weight: bold;">false</span><span style="color: #339933;">,</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">force_long_password</span> ? CLIENT_LONG_PASSWORD <span style="color: #339933;">:</span> <span style="color: #cc66cc;">0</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
			<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">database</span> <span style="color: #339933;">!=</span> <span style="color: #0000ff;">''</span> <span style="color: #339933;">&amp;&amp;</span> <span style="color: #339933;">!</span><span style="color: #990000;">mysql_select_db</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">database</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span>
			<span style="color: #009900;">&#123;</span>
				<span style="color: #000088;">$result</span> <span style="color: #339933;">=</span> <span style="color: #990000;">mysql_error</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
				<span style="color: #b1b100;">print</span> <span style="color: #0000ff;">&quot;Select database failed for <span style="color: #006699; font-weight: bold;">$this-&gt;database</span>: <span style="color: #006699; font-weight: bold;">$result</span><span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">;</span>
			<span style="color: #009900;">&#125;</span>
		<span style="color: #009900;">&#125;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">function</span> Disconnect<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
	<span style="color: #009900;">&#123;</span>
		<span style="color: #000088;">$return</span> <span style="color: #339933;">=</span> <span style="color: #009900; font-weight: bold;">true</span><span style="color: #339933;">;</span>
&nbsp;
		<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #990000;">isset</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">db_object</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span>
		<span style="color: #009900;">&#123;</span>
			<span style="color: #000088;">$return</span> <span style="color: #339933;">=</span> <span style="color: #990000;">mysql_close</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">db_object</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
			<span style="color: #990000;">unset</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">db_object</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span>
&nbsp;
		<span style="color: #b1b100;">return</span> <span style="color: #000088;">$return</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">function</span> Execute<span style="color: #009900;">&#40;</span><span style="color: #000088;">$query</span><span style="color: #009900;">&#41;</span>
	<span style="color: #009900;">&#123;</span>
		<span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">Connect</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #000088;">$result</span> <span style="color: #339933;">=</span> <span style="color: #990000;">mysql_query</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$query</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span><span style="color: #000088;">$result</span><span style="color: #009900;">&#41;</span>
		<span style="color: #009900;">&#123;</span>
			<span style="color: #000088;">$result</span> <span style="color: #339933;">=</span> <span style="color: #990000;">mysql_error</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
			<span style="color: #b1b100;">print</span> <span style="color: #0000ff;">&quot;Query failed: <span style="color: #006699; font-weight: bold;">$result</span><span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">;</span>
			<span style="color: #b1b100;">print</span> <span style="color: #0000ff;">&quot;Teh query itself: <span style="color: #006699; font-weight: bold;">$query</span><span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span>
		<span style="color: #b1b100;">return</span> <span style="color: #000088;">$result</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">?&gt;</span></pre></div></div>

<p>You may find this slightly better than using PHP&#039;s MySQL functions straight out of the box.  Or not.  Who can say?</p>
]]></content:encoded>
			<wfw:commentRss>http://joshduff.com/232/mysql-wrapper-class-php/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Run a query for every table in a database</title>
		<link>http://joshduff.com/189/run-a-query-for-every-table-in-a-database</link>
		<comments>http://joshduff.com/189/run-a-query-for-every-table-in-a-database#comments</comments>
		<pubDate>Wed, 17 Feb 2010 20:16:12 +0000</pubDate>
		<dc:creator>Josh</dc:creator>
				<category><![CDATA[MySQL]]></category>

		<guid isPermaLink="false">http://joshduff.com/?p=189</guid>
		<description><![CDATA[Ever wished you could run a dangerous query like DROP TABLE or TRUNCATE against every table in a database in a single query? No? Well, how about something like CHECK or REPAIR table, then? If you ever find yourself in the rare situation where you need to run the same query across every table in [...]]]></description>
			<content:encoded><![CDATA[<p>Ever wished you could run a dangerous query like DROP TABLE or TRUNCATE against every table in a database in a single query?</p>
<p>No?</p>
<p>Well, how about something like CHECK or REPAIR table, then?</p>
<p>If you ever find yourself in the rare situation where you need to run the same query across every table in a database, this procedure might make your life easier:</p>

<div class="wp_syntax"><div class="code"><pre class="mysql" style="font-family:monospace;">DELIMITER $$
<span style="color: #990099; font-weight: bold;">CREATE</span> <span style="color: #990099; font-weight: bold;">PROCEDURE</span> <span style="color: #008000;">`p<span style="color: #008080; font-weight: bold;">_</span>run<span style="color: #008080; font-weight: bold;">_</span>for<span style="color: #008080; font-weight: bold;">_</span>each<span style="color: #008080; font-weight: bold;">_</span>table`</span><span style="color: #FF00FF;">&#40;</span><span style="color: #990099; font-weight: bold;">IN</span> strDatabase <span style="color: #999900; font-weight: bold;">TEXT</span><span style="color: #000033;">,</span> <span style="color: #990099; font-weight: bold;">IN</span> strOperation <span style="color: #999900; font-weight: bold;">TEXT</span><span style="color: #FF00FF;">&#41;</span>
    <span style="color: #990099; font-weight: bold;">DETERMINISTIC</span>
<span style="color: #990099; font-weight: bold;">BEGIN</span>
	<span style="color: #990099; font-weight: bold;">DECLARE</span> strQuery <span style="color: #999900; font-weight: bold;">TEXT</span><span style="color: #000033;">;</span>
	<span style="color: #990099; font-weight: bold;">DECLARE</span> strTable <span style="color: #999900; font-weight: bold;">VARCHAR</span><span style="color: #FF00FF;">&#40;</span><span style="color: #008080;">255</span><span style="color: #FF00FF;">&#41;</span><span style="color: #000033;">;</span>
	<span style="color: #990099; font-weight: bold;">DECLARE</span> bDone <span style="color: #999900; font-weight: bold;">INT</span> <span style="color: #990099; font-weight: bold;">DEFAULT</span> <span style="color: #008080;">0</span><span style="color: #000033;">;</span>
	<span style="color: #990099; font-weight: bold;">DECLARE</span> TableCursor CURSOR FOR
		<span style="color: #990099; font-weight: bold;">SELECT</span> <span style="color: #008000;">`TABLE<span style="color: #008080; font-weight: bold;">_</span>NAME`</span>
		<span style="color: #990099; font-weight: bold;">FROM</span> <span style="color: #008000;">`information<span style="color: #008080; font-weight: bold;">_</span>schema`</span>.<span style="color: #008000;">`TABLES`</span>
		<span style="color: #990099; font-weight: bold;">WHERE</span> <span style="color: #008000;">`TABLE<span style="color: #008080; font-weight: bold;">_</span>SCHEMA`</span> <span style="color: #CC0099;">=</span> strDatabase <span style="color: #CC0099; font-weight: bold;">AND</span> TABLE_TYPE <span style="color: #CC0099;">=</span> <span style="color: #008000;">'BASE TABLE'</span><span style="color: #000033;">;</span>
	<span style="color: #990099; font-weight: bold;">DECLARE</span> CONTINUE <span style="color: #990099; font-weight: bold;">HANDLER</span> FOR <span style="color: #CC0099; font-weight: bold;">NOT</span> FOUND <span style="color: #990099; font-weight: bold;">SET</span> bDone <span style="color: #CC0099;">=</span> <span style="color: #008080;">1</span><span style="color: #000033;">;</span>
&nbsp;
	OPEN TableCursor<span style="color: #000033;">;</span>
&nbsp;
	<span style="color: #000099;">REPEAT</span>
		FETCH TableCursor <span style="color: #990099; font-weight: bold;">INTO</span> strTable<span style="color: #000033;">;</span>
&nbsp;
		<span style="color: #990099; font-weight: bold;">SET</span> @QueryThatWasPassedIn <span style="color: #CC0099;">:=</span> <span style="color: #000099;">REPLACE</span><span style="color: #FF00FF;">&#40;</span>
			<span style="color: #000099;">REPLACE</span><span style="color: #FF00FF;">&#40;</span>strOperation<span style="color: #000033;">,</span> <span style="color: #008000;">'{?database}'</span><span style="color: #000033;">,</span> strDatabase<span style="color: #FF00FF;">&#41;</span>
			<span style="color: #000033;">,</span> <span style="color: #008000;">'{?table}'</span><span style="color: #000033;">,</span> strTable<span style="color: #FF00FF;">&#41;</span><span style="color: #000033;">;</span>
&nbsp;
		PREPARE Statement <span style="color: #990099; font-weight: bold;">FROM</span> @QueryThatWasPassedIn<span style="color: #000033;">;</span>
		EXECUTE Statement<span style="color: #000033;">;</span>
	UNTIL bDone <span style="color: #009900;">END</span> <span style="color: #000099;">REPEAT</span><span style="color: #000033;">;</span>
&nbsp;
	CLOSE TableCursor<span style="color: #000033;">;</span>
	DEALLOCATE PREPARE Statement<span style="color: #000033;">;</span>
<span style="color: #009900;">END</span>$$
DELIMITER <span style="color: #000033;">;</span></pre></div></div>

<h1>Useage</h1>
<p>The procedure takes two parameters.  The first one is the name of the database whose tables you want to run the query for.</p>
<p>The second is the query you would like to run.  The strings &#034;{?database}&#034; and &#034;{?table}&#034; will be replaced with the database and table names.</p>

<div class="wp_syntax"><div class="code"><pre class="mysql" style="font-family:monospace;"><span style="color: #990099; font-weight: bold;">CALL</span> p_run_for_each_table<span style="color: #FF00FF;">&#40;</span><span style="color: #008000;">'databasename'</span><span style="color: #000033;">,</span> <span style="color: #008000;">'SELECT * FROM {?database}.{?table}'</span><span style="color: #FF00FF;">&#41;</span><span style="color: #000033;">;</span></pre></div></div>

<h1>What queries you can run</h1>
<p>You should be able to use any queries that can be run in a prepared statement &#8211; you can find the list about two-thirds of the way down <a href="http://dev.mysql.com/doc/refman/5.1/en/sql-syntax-prepared-statements.html">this page</a>.</p>
<p>As of MySQL 5.1, you can run these queries: &#034;ALTER TABLE, CALL, COMMIT, CREATE INDEX, CREATE TABLE, DELETE, DO, DROP INDEX, DROP TABLE, INSERT, RENAME TABLE, REPLACE, SELECT, SET, UPDATE, and most SHOW statements.&#034;</p>
]]></content:encoded>
			<wfw:commentRss>http://joshduff.com/189/run-a-query-for-every-table-in-a-database/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Logical errors in queries: DO NOT WANT</title>
		<link>http://joshduff.com/173/logical-errors-in-queries-do-not-want</link>
		<comments>http://joshduff.com/173/logical-errors-in-queries-do-not-want#comments</comments>
		<pubDate>Wed, 03 Feb 2010 03:17:58 +0000</pubDate>
		<dc:creator>Josh</dc:creator>
				<category><![CDATA[MySQL]]></category>

		<guid isPermaLink="false">http://joshduff.com/?p=173</guid>
		<description><![CDATA[During my career developing database-driven software (teehee, I&#039;m a professional) I&#039;ve noted that the most horrific query errors are the logical ones &#8211; queries that parse correctly, and return reasonable-looking data, but make wrong assumptions about how different parts of the query relate to each other. One particular error that I&#039;ve seen time and time [...]]]></description>
			<content:encoded><![CDATA[<p>During my career developing database-driven software (teehee, I&#039;m a professional) I&#039;ve noted that the most horrific query errors are the logical ones &#8211; queries that parse correctly, and return reasonable-looking data, but make wrong assumptions about how different parts of the query relate to each other.</p>
<p>One particular error that I&#039;ve seen time and time again (even from people who have been writing queries for a while) can occur when summarizing data from multiple tables that have a one-to-many relationship.</p>
<p>&#8230;In other words, it could occur in queries written for most database-driven software.</p>
<h2>Solution: fix the problem by writing about it!</h2>
<p>I wrote <a href="http://wikido.isoftdata.com/index.php/The_GROUPing_pitfall">a page documenting</a> the cause of the logical error, doing my best to warn people against letting it slip into their own code.</p>
<p>I attempted to write it so it would be easy to read, possibly even entertaining (a lofty goal for a manual on writing database queries, perhaps) &#8211; there is some colorful language and plenty of juvenile humor mixed with the tech-speak.</p>
<p>The doc itself is part of the wiki of the company where I work.  I don&#039;t write a ton of documentation for our developers or customers (certainly not as much as I should), but whenever I do, I get this awesome feeling of usefulness.  Oh, and pride.  Sometimes, I feel so proud, that I feel compelled to link other people (who have no relationship to my company) to what I wrote!  Ridiculous, I know.</p>
<p>Remember: if you write queries, it is your responsibility to guarantee that they return true and accurate data!</p>
]]></content:encoded>
			<wfw:commentRss>http://joshduff.com/173/logical-errors-in-queries-do-not-want/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Convert blocks of text to sentence case</title>
		<link>http://joshduff.com/156/convert-blocks-of-text-to-sentence-case</link>
		<comments>http://joshduff.com/156/convert-blocks-of-text-to-sentence-case#comments</comments>
		<pubDate>Thu, 21 Jan 2010 01:31:28 +0000</pubDate>
		<dc:creator>Josh</dc:creator>
				<category><![CDATA[MySQL]]></category>

		<guid isPermaLink="false">http://joshduff.com/?p=156</guid>
		<description><![CDATA[You know what I hate? Paragraphs of capital (or all lowercase) letters. The other day a coworker was looking to beautify a large quantity of data spread across some MySQL tables.  I created this function to make his life easier: DELIMITER $$ CREATE FUNCTION `f_sentence_case`&#40;strInput TEXT, nMinimumLength INT&#41; RETURNS TEXT DETERMINISTIC BEGIN &#160; DECLARE result [...]]]></description>
			<content:encoded><![CDATA[<p>You know what I hate?  Paragraphs of capital (or all lowercase) letters.</p>
<p>The other day a coworker was looking to beautify a large quantity of data spread across some MySQL tables.  I created this function to make his life easier:</p>

<div class="wp_syntax"><div class="code"><pre class="mysql" style="font-family:monospace;">DELIMITER $$
<span style="color: #990099; font-weight: bold;">CREATE</span> <span style="color: #990099; font-weight: bold;">FUNCTION</span> <span style="color: #008000;">`f<span style="color: #008080; font-weight: bold;">_</span>sentence<span style="color: #008080; font-weight: bold;">_</span>case`</span><span style="color: #FF00FF;">&#40;</span>strInput <span style="color: #999900; font-weight: bold;">TEXT</span><span style="color: #000033;">,</span> nMinimumLength <span style="color: #999900; font-weight: bold;">INT</span><span style="color: #FF00FF;">&#41;</span> <span style="color: #990099; font-weight: bold;">RETURNS</span> <span style="color: #999900; font-weight: bold;">TEXT</span>
<span style="color: #990099; font-weight: bold;">DETERMINISTIC</span>
<span style="color: #990099; font-weight: bold;">BEGIN</span>
&nbsp;
	<span style="color: #990099; font-weight: bold;">DECLARE</span> result <span style="color: #999900; font-weight: bold;">TEXT</span><span style="color: #000033;">;</span>
	<span style="color: #990099; font-weight: bold;">DECLARE</span> LastSpace <span style="color: #999900; font-weight: bold;">INT</span><span style="color: #000033;">;</span>
	<span style="color: #990099; font-weight: bold;">DECLARE</span> NextSpace <span style="color: #999900; font-weight: bold;">INT</span><span style="color: #000033;">;</span>
	<span style="color: #990099; font-weight: bold;">DECLARE</span> NextSlash <span style="color: #999900; font-weight: bold;">INT</span><span style="color: #000033;">;</span>
	<span style="color: #990099; font-weight: bold;">DECLARE</span> Word <span style="color: #999900; font-weight: bold;">TEXT</span><span style="color: #000033;">;</span>
	<span style="color: #990099; font-weight: bold;">DECLARE</span> NewSentence <span style="color: #999900; font-weight: bold;">INT</span><span style="color: #000033;">;</span>
	<span style="color: #990099; font-weight: bold;">DECLARE</span> PreviousCharacter <span style="color: #000099;">CHAR</span><span style="color: #FF00FF;">&#40;</span><span style="color: #008080;">1</span><span style="color: #FF00FF;">&#41;</span><span style="color: #000033;">;</span>
	<span style="color: #990099; font-weight: bold;">DECLARE</span> TrimmedWord <span style="color: #999900; font-weight: bold;">TEXT</span><span style="color: #000033;">;</span>
	<span style="color: #990099; font-weight: bold;">DECLARE</span> NumberOfSpaces <span style="color: #999900; font-weight: bold;">INT</span><span style="color: #000033;">;</span>
	<span style="color: #990099; font-weight: bold;">DECLARE</span> Swap <span style="color: #999900; font-weight: bold;">INT</span><span style="color: #000033;">;</span>
&nbsp;
	<span style="color: #990099; font-weight: bold;">SET</span> strInput <span style="color: #CC0099;">:=</span> <span style="color: #000099;">CONCAT</span><span style="color: #FF00FF;">&#40;</span>strInput<span style="color: #000033;">,</span> <span style="color: #008000;">' '</span><span style="color: #FF00FF;">&#41;</span><span style="color: #000033;">;</span>
	<span style="color: #990099; font-weight: bold;">SET</span> result <span style="color: #CC0099;">:=</span> <span style="color: #008000;">''</span><span style="color: #000033;">;</span>
	<span style="color: #990099; font-weight: bold;">SET</span> LastSpace <span style="color: #CC0099;">:=</span> <span style="color: #008080;">1</span><span style="color: #000033;">;</span>
	<span style="color: #990099; font-weight: bold;">SET</span> NextSpace <span style="color: #CC0099;">:=</span> <span style="color: #000099;">LOCATE</span><span style="color: #FF00FF;">&#40;</span><span style="color: #008000;">' '</span><span style="color: #000033;">,</span> strInput<span style="color: #000033;">,</span> LastSpace <span style="color: #CC0099;">+</span> <span style="color: #008080;">1</span><span style="color: #FF00FF;">&#41;</span><span style="color: #000033;">;</span>
	<span style="color: #990099; font-weight: bold;">SET</span> NextSlash <span style="color: #CC0099;">:=</span> <span style="color: #000099;">LOCATE</span><span style="color: #FF00FF;">&#40;</span><span style="color: #008000;">'/'</span><span style="color: #000033;">,</span> strInput<span style="color: #000033;">,</span> LastSpace <span style="color: #CC0099;">+</span> <span style="color: #008080;">1</span><span style="color: #FF00FF;">&#41;</span><span style="color: #000033;">;</span>
&nbsp;
	<span style="color: #990099; font-weight: bold;">SET</span> NextSpace <span style="color: #CC0099;">:=</span> <span style="color: #009900;">IF</span><span style="color: #FF00FF;">&#40;</span><span style="color: #000099;">LEAST</span><span style="color: #FF00FF;">&#40;</span>NextSlash<span style="color: #000033;">,</span> NextSpace<span style="color: #FF00FF;">&#41;</span> <span style="color: #CC0099;">=</span> <span style="color: #008080;">0</span><span style="color: #000033;">,</span> <span style="color: #000099;">GREATEST</span><span style="color: #FF00FF;">&#40;</span>NextSlash<span style="color: #000033;">,</span> NextSpace<span style="color: #FF00FF;">&#41;</span><span style="color: #000033;">,</span> <span style="color: #000099;">LEAST</span><span style="color: #FF00FF;">&#40;</span>NextSlash<span style="color: #000033;">,</span> NextSpace<span style="color: #FF00FF;">&#41;</span><span style="color: #FF00FF;">&#41;</span><span style="color: #000033;">;</span>
&nbsp;
	label1: WHILE NextSpace <span style="color: #990099; font-weight: bold;">DO</span>
&nbsp;
		<span style="color: #990099; font-weight: bold;">SET</span> Word <span style="color: #CC0099;">:=</span> SUBSTR<span style="color: #FF00FF;">&#40;</span>strInput<span style="color: #000033;">,</span> LastSpace<span style="color: #000033;">,</span> NextSpace <span style="color: #CC0099;">-</span> LastSpace<span style="color: #FF00FF;">&#41;</span><span style="color: #000033;">;</span>
		<span style="color: #990099; font-weight: bold;">SET</span> PreviousCharacter <span style="color: #CC0099;">:=</span> SUBSTR<span style="color: #FF00FF;">&#40;</span>strInput<span style="color: #000033;">,</span> LastSpace <span style="color: #CC0099;">-</span> <span style="color: #008080;">1</span><span style="color: #000033;">,</span> <span style="color: #008080;">1</span><span style="color: #FF00FF;">&#41;</span><span style="color: #000033;">;</span>
		<span style="color: #990099; font-weight: bold;">SET</span> NewSentence <span style="color: #CC0099;">:=</span> LastSpace <span style="color: #CC0099;">=</span> <span style="color: #008080;">1</span> <span style="color: #CC0099; font-weight: bold;">OR</span> <span style="color: #FF00FF;">&#40;</span>NewSentence <span style="color: #CC0099; font-weight: bold;">AND</span> PreviousCharacter <span style="color: #CC0099;">=</span> <span style="color: #008000;">' '</span><span style="color: #FF00FF;">&#41;</span> <span style="color: #CC0099; font-weight: bold;">OR</span> PreviousCharacter <span style="color: #000099;">IN</span><span style="color: #FF00FF;">&#40;</span><span style="color: #008000;">'.'</span><span style="color: #000033;">,</span> <span style="color: #008000;">'!'</span><span style="color: #000033;">,</span> <span style="color: #008000;">'?'</span><span style="color: #FF00FF;">&#41;</span><span style="color: #000033;">;</span>
&nbsp;
		<span style="color: #990099; font-weight: bold;">SET</span> TrimmedWord <span style="color: #CC0099;">:=</span> <span style="color: #000099;">LTRIM</span><span style="color: #FF00FF;">&#40;</span>Word<span style="color: #FF00FF;">&#41;</span><span style="color: #000033;">;</span>
		<span style="color: #990099; font-weight: bold;">SET</span> NumberOfSpaces <span style="color: #CC0099;">:=</span> <span style="color: #000099;">LENGTH</span><span style="color: #FF00FF;">&#40;</span>Word<span style="color: #FF00FF;">&#41;</span> <span style="color: #CC0099;">-</span> <span style="color: #000099;">LENGTH</span><span style="color: #FF00FF;">&#40;</span>TrimmedWord<span style="color: #FF00FF;">&#41;</span><span style="color: #000033;">;</span>
		<span style="color: #990099; font-weight: bold;">SET</span> Word <span style="color: #CC0099;">:=</span> TrimmedWord<span style="color: #000033;">;</span>
&nbsp;
		<span style="color: #808080; font-style: italic;"># Make it lowercase if it is all uppercase</span>
		<span style="color: #990099; font-weight: bold;">SET</span> Word <span style="color: #CC0099;">:=</span> <span style="color: #009900;">IF</span><span style="color: #FF00FF;">&#40;</span><span style="color: #000099;">LENGTH</span><span style="color: #FF00FF;">&#40;</span>Word<span style="color: #FF00FF;">&#41;</span> <span style="color: #CC0099;">&gt;=</span> nMinimumLength <span style="color: #CC0099; font-weight: bold;">AND</span> Word <span style="color: #CC0099; font-weight: bold;">NOT</span> <span style="color: #CC0099; font-weight: bold;">REGEXP</span> <span style="color: #008000;">'[0-9]'</span><span style="color: #000033;">,</span> 
			<span style="color: #009900;">IF</span><span style="color: #FF00FF;">&#40;</span>NewSentence<span style="color: #000033;">,</span>
				<span style="color: #000099;">CONCAT</span><span style="color: #FF00FF;">&#40;</span><span style="color: #000099;">UCASE</span><span style="color: #FF00FF;">&#40;</span>SUBSTR<span style="color: #FF00FF;">&#40;</span>Word<span style="color: #000033;">,</span> <span style="color: #008080;">1</span><span style="color: #000033;">,</span> <span style="color: #008080;">1</span><span style="color: #FF00FF;">&#41;</span><span style="color: #FF00FF;">&#41;</span><span style="color: #000033;">,</span> <span style="color: #000099;">LCASE</span><span style="color: #FF00FF;">&#40;</span>SUBSTR<span style="color: #FF00FF;">&#40;</span>Word<span style="color: #000033;">,</span> <span style="color: #008080;">2</span><span style="color: #000033;">,</span> <span style="color: #000099;">LENGTH</span><span style="color: #FF00FF;">&#40;</span>Word<span style="color: #FF00FF;">&#41;</span> <span style="color: #CC0099;">-</span> <span style="color: #008080;">1</span><span style="color: #FF00FF;">&#41;</span><span style="color: #FF00FF;">&#41;</span><span style="color: #FF00FF;">&#41;</span><span style="color: #000033;">,</span>
				<span style="color: #000099;">LCASE</span><span style="color: #FF00FF;">&#40;</span>Word<span style="color: #FF00FF;">&#41;</span>
			<span style="color: #FF00FF;">&#41;</span><span style="color: #000033;">,</span> 
			Word<span style="color: #FF00FF;">&#41;</span><span style="color: #000033;">;</span>
&nbsp;
		<span style="color: #990099; font-weight: bold;">SET</span> result <span style="color: #CC0099;">:=</span> <span style="color: #000099;">CONCAT</span><span style="color: #FF00FF;">&#40;</span>result<span style="color: #000033;">,</span> <span style="color: #000099;">REPEAT</span><span style="color: #FF00FF;">&#40;</span><span style="color: #008000;">' '</span><span style="color: #000033;">,</span> NumberOfSpaces<span style="color: #FF00FF;">&#41;</span><span style="color: #000033;">,</span> Word<span style="color: #FF00FF;">&#41;</span><span style="color: #000033;">;</span>
&nbsp;
		<span style="color: #990099; font-weight: bold;">SET</span> Swap <span style="color: #CC0099;">:=</span> LastSpace<span style="color: #000033;">;</span>
		<span style="color: #990099; font-weight: bold;">SET</span> LastSpace <span style="color: #CC0099;">:=</span> NextSpace<span style="color: #000033;">;</span>
		<span style="color: #990099; font-weight: bold;">SET</span> NextSpace <span style="color: #CC0099;">:=</span> <span style="color: #000099;">LOCATE</span><span style="color: #FF00FF;">&#40;</span><span style="color: #008000;">' '</span><span style="color: #000033;">,</span> strInput<span style="color: #000033;">,</span> Swap <span style="color: #CC0099;">+</span> <span style="color: #008080;">1</span><span style="color: #FF00FF;">&#41;</span><span style="color: #000033;">;</span>
		<span style="color: #990099; font-weight: bold;">SET</span> NextSlash <span style="color: #CC0099;">:=</span> <span style="color: #000099;">LOCATE</span><span style="color: #FF00FF;">&#40;</span><span style="color: #008000;">'/'</span><span style="color: #000033;">,</span> strInput<span style="color: #000033;">,</span> Swap <span style="color: #CC0099;">+</span> <span style="color: #008080;">1</span><span style="color: #FF00FF;">&#41;</span><span style="color: #000033;">;</span>
		<span style="color: #990099; font-weight: bold;">SET</span> NextSpace <span style="color: #CC0099;">:=</span> <span style="color: #009900;">IF</span><span style="color: #FF00FF;">&#40;</span><span style="color: #000099;">LEAST</span><span style="color: #FF00FF;">&#40;</span>NextSlash<span style="color: #000033;">,</span> NextSpace<span style="color: #FF00FF;">&#41;</span> <span style="color: #CC0099;">=</span> <span style="color: #008080;">0</span><span style="color: #000033;">,</span> <span style="color: #000099;">GREATEST</span><span style="color: #FF00FF;">&#40;</span>NextSlash<span style="color: #000033;">,</span> NextSpace<span style="color: #FF00FF;">&#41;</span><span style="color: #000033;">,</span> <span style="color: #000099;">LEAST</span><span style="color: #FF00FF;">&#40;</span>NextSlash<span style="color: #000033;">,</span> NextSpace<span style="color: #FF00FF;">&#41;</span><span style="color: #FF00FF;">&#41;</span><span style="color: #000033;">;</span>
&nbsp;
	<span style="color: #009900;">END</span> WHILE label1<span style="color: #000033;">;</span>
&nbsp;
RETURN result<span style="color: #000033;">;</span>
&nbsp;
<span style="color: #009900;">END</span>$$
DELIMITER <span style="color: #000033;">;</span></pre></div></div>

<h1>What it does</h1>
<p>It seems to perform generally as I hoped it would; which is to say that it formats text to be sentence case.</p>
<p>More specifically, it alters all the &#034;words&#034; (a set of non-numeric, non-whitespace characters) that are longer than the specified minimum length.</p>
<p>It changes the words to be all lowercase, unless they happen to be the first word after a punctuation mark (in which case the first character of the word is made uppercase).</p>
<h1>Useage</h1>
<p>To clean up a field so that it is formatted in sentence case (ignoring all words with less than 3 characters), simply run this query:</p>

<div class="wp_syntax"><div class="code"><pre class="mysql" style="font-family:monospace;"><span style="color: #990099; font-weight: bold;">UPDATE</span> <span style="color: #008000;">`table`</span> <span style="color: #990099; font-weight: bold;">SET</span> <span style="color: #008000;">`field`</span> <span style="color: #CC0099;">=</span> f_sentence_case<span style="color: #FF00FF;">&#40;</span><span style="color: #008000;">`field`</span><span style="color: #000033;">,</span> <span style="color: #008080;">3</span><span style="color: #FF00FF;">&#41;</span><span style="color: #000033;">;</span></pre></div></div>

<p>Other than that, my only specs for the query were for it to be functional and hopefully not break my brain when I went back to read it later.  If anyone has any significant improvements to it, let me know!</p>
]]></content:encoded>
			<wfw:commentRss>http://joshduff.com/156/convert-blocks-of-text-to-sentence-case/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>My accomplishment for the day: a MySQL quine!</title>
		<link>http://joshduff.com/36/my-accomplishment-for-the-day-a-mysql-quine</link>
		<comments>http://joshduff.com/36/my-accomplishment-for-the-day-a-mysql-quine#comments</comments>
		<pubDate>Fri, 28 Nov 2008 00:38:00 +0000</pubDate>
		<dc:creator>Josh</dc:creator>
				<category><![CDATA[MySQL]]></category>

		<guid isPermaLink="false">http://joshduff.com/http:/joshduff.com/36/my-accomplishment-for-the-day-a-mysql-quine</guid>
		<description><![CDATA[Some background: a &#034;quine&#034; is a program that outputs it&#039;s complete source code when run. Some more background: I work at a company where I work with MySQL (a database engine) very often. I was lounging around in the MySQL chat room on irc.freenode.net, and someone suggested that I try to write a MySQL quine [...]]]></description>
			<content:encoded><![CDATA[<p>Some background: a &#034;<a href="http://en.wikipedia.org/wiki/Quine_%28computing%29">quine</a>&#034; is a program that outputs it&#039;s complete source code when run.</p>
<p>Some more background: I work at a company where I work with MySQL (a database engine) very often.</p>
<p>I was lounging around in the MySQL chat room on irc.freenode.net, and someone suggested that I try to write a MySQL quine &#8211; a database query that would return the text of the query itself.</p>
<p>After about half an hour of screwing around, I got it!  It may not be a fantastic achievement, but I feel pretty leet about writing my first quine in a database query language.</p>

<div class="wp_syntax"><div class="code"><pre class="mysql" style="font-family:monospace;"><span style="color: #990099; font-weight: bold;">SELECT</span> <span style="color: #000099;">REPLACE</span><span style="color: #FF00FF;">&#40;</span>@v<span style="color: #CC0099;">:=</span><span style="color: #008000;">'SELECT REPLACE(@v:=<span style="color: #004000; font-weight: bold;">\'</span>2<span style="color: #004000; font-weight: bold;">\'</span>,1+1,REPLACE(REPLACE(@v,<span style="color: #004000; font-weight: bold;">\'</span><span style="color: #004000; font-weight: bold;">\\</span><span style="color: #004000; font-weight: bold;">\\</span><span style="color: #004000; font-weight: bold;">\'</span>,<span style="color: #004000; font-weight: bold;">\'</span><span style="color: #004000; font-weight: bold;">\\</span><span style="color: #004000; font-weight: bold;">\\</span><span style="color: #004000; font-weight: bold;">\\</span><span style="color: #004000; font-weight: bold;">\\</span><span style="color: #004000; font-weight: bold;">\'</span>),<span style="color: #004000; font-weight: bold;">\'</span><span style="color: #004000; font-weight: bold;">\\</span><span style="color: #004000; font-weight: bold;">\'</span><span style="color: #004000; font-weight: bold;">\'</span>,<span style="color: #004000; font-weight: bold;">\'</span><span style="color: #004000; font-weight: bold;">\\</span><span style="color: #004000; font-weight: bold;">\\</span><span style="color: #004000; font-weight: bold;">\\</span><span style="color: #004000; font-weight: bold;">\'</span><span style="color: #004000; font-weight: bold;">\'</span>));'</span><span style="color: #000033;">,</span><span style="color: #008080;">1</span><span style="color: #CC0099;">+</span><span style="color: #008080;">1</span><span style="color: #000033;">,</span><span style="color: #000099;">REPLACE</span><span style="color: #FF00FF;">&#40;</span><span style="color: #000099;">REPLACE</span><span style="color: #FF00FF;">&#40;</span>@v<span style="color: #000033;">,</span><span style="color: #008000;">'<span style="color: #004000; font-weight: bold;">\\</span>'</span><span style="color: #000033;">,</span><span style="color: #008000;">'<span style="color: #004000; font-weight: bold;">\\</span><span style="color: #004000; font-weight: bold;">\\</span>'</span><span style="color: #FF00FF;">&#41;</span><span style="color: #000033;">,</span><span style="color: #008000;">'<span style="color: #004000; font-weight: bold;">\'</span>'</span><span style="color: #000033;">,</span><span style="color: #008000;">'<span style="color: #004000; font-weight: bold;">\\</span><span style="color: #004000; font-weight: bold;">\'</span>'</span><span style="color: #FF00FF;">&#41;</span><span style="color: #FF00FF;">&#41;</span><span style="color: #000033;">;</span></pre></div></div>

<p>Only 167 characters.  Hah!</p>
]]></content:encoded>
			<wfw:commentRss>http://joshduff.com/36/my-accomplishment-for-the-day-a-mysql-quine/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
