<?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>Mikael Brevik &#187; MySQL</title>
	<atom:link href="http://mikaelb.net/emne/mysql/feed/" rel="self" type="application/rss+xml" />
	<link>http://mikaelb.net</link>
	<description>Bloggen</description>
	<lastBuildDate>Mon, 07 Sep 2009 20:11:35 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Liten innføring i foreninger (JOIN) i SQL</title>
		<link>http://mikaelb.net/2009/09/liten-innf%c3%b8ring-i-foreninger-join-i-sql/</link>
		<comments>http://mikaelb.net/2009/09/liten-innf%c3%b8ring-i-foreninger-join-i-sql/#comments</comments>
		<pubDate>Mon, 07 Sep 2009 20:09:39 +0000</pubDate>
		<dc:creator>Mikael Brevik</dc:creator>
				<category><![CDATA[Generelt]]></category>
		<category><![CDATA[MySQL]]></category>

		<guid isPermaLink="false">http://mikaelb.net/?p=161</guid>
		<description><![CDATA[Denne artikkelen baserer seg mest på SQL-standarden (Oracle), men kommer også til å komme med innstikk dersom forskjellige metoder ikke fungerer i MySQL, da jeg går ut i fra at denne dialekten er den mest brukte her på forumet, men tror ikke det skal bli noe problem.
Noen ord om forening (JOIN)
En forening, eller JOIN som [...]]]></description>
			<content:encoded><![CDATA[<p>Denne artikkelen baserer seg mest på SQL-standarden (Oracle), men kommer også til å komme med innstikk dersom forskjellige metoder ikke fungerer i MySQL, da jeg går ut i fra at denne dialekten er den mest brukte her på forumet, men tror ikke det skal bli noe problem.</p>
<h2><strong>Noen ord om forening (JOIN)</strong></h2>
<p>En forening, eller JOIN som det heter på engelsk, er en rasjonell operator på lik linje som utvelgelse av kolonner eller rader som skal vises. Det er en operasjon på relasjons-databaser som brukes til å koble sammen to eller flere tabeller i en database &#8211; igjennom en felles kolonne. Dersom man bruker MySQL og InnoDB vil det som regel være primærnøkkelen og fremmednøkkelen som blir brukt som bindeledd.</p>
<p>Et lite eksempel på hva man kan oppnå med forening.</p>
<p>Jeg har to tabeller. Den ene inneholder personer i et register, den andre inneholder postnummer og poststed. Det jeg vil oppnå er å liste ut alle personer med tilhørende poststed. Tabellene ser slik ut (bruker relasjonell form).</p>

<div class="wp_syntax"><div class="code"><pre class="sql" style="font-family:monospace;">person <span style="color: #66cc66;">&#40;</span>person_id<span style="color: #66cc66;">,</span> name<span style="color: #66cc66;">,</span> zip_code<span style="color: #66cc66;">*</span><span style="color: #66cc66;">&#41;</span>;
&nbsp;
postal <span style="color: #66cc66;">&#40;</span>zip_code<span style="color: #66cc66;">,</span> post_place<span style="color: #66cc66;">&#41;</span>;</pre></div></div>

<p>De som er understreket er primærnøkler og * markerer en fremmednøkkel. Dette er hva vi kaller en en-til-mange relasjon. For å hente ut ønsket info kan jeg bruke denne spørringen.</p>

<div class="wp_syntax"><div class="code"><pre class="sql" style="font-family:monospace;"><span style="color: #993333; font-weight: bold;">SELECT</span> t1<span style="color: #66cc66;">.</span>name<span style="color: #66cc66;">,</span> t2<span style="color: #66cc66;">.</span>post_place <span style="color: #993333; font-weight: bold;">FROM</span> person t1 <span style="color: #993333; font-weight: bold;">INNER</span> <span style="color: #993333; font-weight: bold;">JOIN</span> postal t2 <span style="color: #993333; font-weight: bold;">ON</span> t1<span style="color: #66cc66;">.</span>zip_code <span style="color: #66cc66;">=</span> t2<span style="color: #66cc66;">.</span>zip_code;</pre></div></div>

<p>Nå som vi har fått unna et kjapt eksempel kan vi gå over til hvilke forskjellige foreningsmetoder vi har og når vi vil bruke de.</p>
<h2><strong>De jeg kommer til å gjennomgå er </strong></h2>
<ol>
<li>INNER JOIN og NATURAL JOIN</li>
<li>LEFT OUTER JOIN</li>
<li>RIGHT OUTER JOIN</li>
<li>FULL OUTER JOIN</li>
<li>CROSS JOIN (noen kjappe ord)</li>
</ol>
<h2>INNER JOIN</h2>
<p><img class="aligncenter size-full wp-image-160" title="inner_join" src="http://mikaelb.net/wp-content/uploads/2009/09/inner_join.png" alt="inner_join" width="500" height="265" /></p>
<p>INNER JOIN, med LEFT/RIGHT JOIN, er nok den foreningen som kommer til å bli brukt mest. Det er noe som kalles equijoin, og betyr rett og slett at man henter ut informasjonen bundet sammen av to felles verdier i en kolonne/attributt. Kodene ovenfor er et eksempel på denne typen forening.</p>
<p>Det som gjør INNER JOIN forskjellig fra noen OUTER JOIN (som LEFT/RIGHT) er at vi henter kun ut de radene (også kalt «tupler») som har verdier i begge de kolonnene som vi forener om. Om vi viderefører eksemplet ovenfor vil dette si at kun personer med poststed og kun poststedene med personer i seg blir hentet ut. Vi får ikke listet ut alle poststedene som ikke er bebodd av noen medlemmer i person-tabellen vår, og vi får heller ikke listet ut personer som ikke har noe poststed registrert.</p>
<p>Eksempel på INNER JOIN finner har jeg allerede skrevet i toppen av artikkelen.</p>
<h3><strong>NATURAL JOIN</strong></h3>
<p>NATURAL JOIN er i all basis det samme som en INNER JOIN. Eneste forskjellen er at vi fjerner duplikatkolonner. Vi ser at både postal- og person-tabellene inneholder zip_code kolonnen. Dersom vi henter ut alle felt med en vanlig INNER JOIN vil begge disse hentes ut. Det er naturlig at vi ikke trenger denne informasjonen to ganger. Det er sløsing med dataplass/minnebruk. Dersom vi bruker projeksjon (en relasjonell operator som tillater oss å velge hvilke kolonner vi vil ha ut &#8211; f.eks SELECT <strong>field1, field2 [...]</strong>), er det ikke nødvendig med NATURAL JOIN.</p>
<h4><strong>Eksempel på NATURAL JOIN</strong></h4>

<div class="wp_syntax"><div class="code"><pre class="sql" style="font-family:monospace;"><span style="color: #993333; font-weight: bold;">SELECT</span> <span style="color: #66cc66;">*</span> <span style="color: #993333; font-weight: bold;">FROM</span> person t1 <span style="color: #993333; font-weight: bold;">NATURAL</span> <span style="color: #993333; font-weight: bold;">JOIN</span> postal t2 <span style="color: #993333; font-weight: bold;">ON</span> t1<span style="color: #66cc66;">.</span>zip_code <span style="color: #66cc66;">=</span> t2<span style="color: #66cc66;">.</span>zip_code;</pre></div></div>

<p><strong></strong></p>
<h2>LEFT OUTER JOIN</h2>
<p><img class="aligncenter size-full wp-image-158" title="left_outer_join" src="http://mikaelb.net/wp-content/uploads/2009/09/left_outer_join.png" alt="left_outer_join" width="500" height="265" /></p>
<p>Nå har vi beveget oss ut på ytterforening. I motsetning til INNER JOIN vil en LEFT OUTER JOIN favorisere en side av tabellene. Det er fortsatt en såkalt «equijoin». Relatert til det eksemplet vi har brukt tidligere vil det bety at vi kan hente ut alle postkodene uavhengig av om de har personer registrert til seg eller ikke &#8211; eller motsatt; alle personer uavhengig om de har registrert postkode.</p>
<p>Her er OUTER et valgfritt nøkkelord i spørringen. LEFT JOIN er såvidt jeg vet det samme som LEFT OUTER JOIN.</p>
<h3><strong>Eksempel på LEFT [OUTER] JOIN</strong></h3>
<p>Jeg vil hente ut alle personer og dersom de har registrert poststed vil jeg også vise disse.</p>

<div class="wp_syntax"><div class="code"><pre class="sql" style="font-family:monospace;"><span style="color: #993333; font-weight: bold;">SELECT</span> t1<span style="color: #66cc66;">.</span>name<span style="color: #66cc66;">,</span> t2<span style="color: #66cc66;">.</span>post_place <span style="color: #993333; font-weight: bold;">FROM</span> person t1 <span style="color: #993333; font-weight: bold;">LEFT</span> <span style="color: #993333; font-weight: bold;">JOIN</span> postal t2 <span style="color: #993333; font-weight: bold;">ON</span> t1<span style="color: #66cc66;">.</span>zip_code <span style="color: #66cc66;">=</span> t2<span style="color: #66cc66;">.</span>zip_code;</pre></div></div>

<p>Du ser her at tabellen person er den tabellen som står etter FROM-nøkkelordet. Dette gjør den til en venstrestilt tabell, og det er den vi favoriserer ved å bruke LEFT JOIN.</p>
<h2><strong>RIGHT OUTER JOIN</strong></h2>
<p><strong><img class="aligncenter size-full wp-image-157" title="right_outer_join" src="http://mikaelb.net/wp-content/uploads/2009/09/right_outer_join.png" alt="right_outer_join" width="500" height="265" /><br />
</strong></p>
<p>RIGHT OUTER JOIN er i praksis veldig lik LEFT OUTER JOIN. Eneste forskjellen på disse er hvilken side vi vil favorisere. Vi ser av forrige punkt om LEFT JOIN er det person som blir favorisert. Dersom jeg bruker RIGHT JOIN er det postal-tabellen som blir hovedtabellen. Resultatet vil være en tabell over alle postkoder og tilhørende personer som er registrert. Siden vi ikke grupperer vil vi få flere resultater av samme postkode, da «tuplene» er av forskjellige kombinasjoner (forskjellige personer til samme postkode).</p>
<h3><strong>Eksempel på RIGHT [OUTER] JOIN</strong></h3>
<p>Jeg vil hente ut alle postkoder og dersom de har registrert personer vil jeg også vise alle disse.</p>

<div class="wp_syntax"><div class="code"><pre class="sql" style="font-family:monospace;"><span style="color: #993333; font-weight: bold;">SELECT</span> t1<span style="color: #66cc66;">.</span>name<span style="color: #66cc66;">,</span> t2<span style="color: #66cc66;">.</span>post_place <span style="color: #993333; font-weight: bold;">FROM</span> person t1 <span style="color: #993333; font-weight: bold;">RIGHT</span> <span style="color: #993333; font-weight: bold;">JOIN</span> postal t2 <span style="color: #993333; font-weight: bold;">ON</span> t1<span style="color: #66cc66;">.</span>zip_code <span style="color: #66cc66;">=</span> t2<span style="color: #66cc66;">.</span>zip_code;</pre></div></div>

<h2><strong>FULL OUTER JOIN</strong></h2>
<p><strong><img class="aligncenter size-full wp-image-159" title="full_outer_join" src="http://mikaelb.net/wp-content/uploads/2009/09/full_outer_join.png" alt="full_outer_join" width="500" height="265" /><br />
</strong></p>
<p>Siden dette også er en OUTER JOIN kan vi kanskje se for oss hva vi kommer til å få. Dette er en ytterforening som ikke favoriserer noen side. Den kommer til å vise poststeder med og uten personer og personer med og uten poststed.</p>
<h3><strong>Eksempel på FULL OUTER JOIN</strong></h3>

<div class="wp_syntax"><div class="code"><pre class="sql" style="font-family:monospace;"><span style="color: #993333; font-weight: bold;">SELECT</span> t1<span style="color: #66cc66;">.</span>name<span style="color: #66cc66;">,</span> t2<span style="color: #66cc66;">.</span>post_place <span style="color: #993333; font-weight: bold;">FROM</span> person t1 <span style="color: #993333; font-weight: bold;">FULL</span> <span style="color: #993333; font-weight: bold;">OUTER</span> <span style="color: #993333; font-weight: bold;">JOIN</span> postal t2 <span style="color: #993333; font-weight: bold;">ON</span> t1<span style="color: #66cc66;">.</span>zip_code <span style="color: #66cc66;">=</span> t2<span style="color: #66cc66;">.</span>zip_code;</pre></div></div>

<h2><strong>CROSS JOIN</strong></h2>
<p>Denne foreningen er litt anderledes enn de vi har sett på til nå. På norsk kalles dette gjerne kryssprodukt eller kartesisk produkt. Her har vi en forening uten noe nøkkelord som JOIN. Vi bruker rett og slett flere tabeller adskilt av komma etter FROM. Uten noe seleksjon (i praksis WHERE-nøkkelordet) vil dette gi alle mulige kombinasjoner av de to tabellene sammenlagt.</p>
<h3><strong>Eksempel på CROSS JOIN</strong></h3>
<p>Jeg har en tabell med navn tabell1 som har kun én kolonne; tall. Denne tabellen inneholder følgende data: 1, 2, 3. Jeg har også en tabell til med navn tabell2 som inneholder akkurat samme data.</p>
<p>Dersom jeg da kjører følgende spørring:</p>

<div class="wp_syntax"><div class="code"><pre class="sql" style="font-family:monospace;"><span style="color: #993333; font-weight: bold;">SELECT</span> <span style="color: #66cc66;">*</span> <span style="color: #993333; font-weight: bold;">FROM</span> tabell1<span style="color: #66cc66;">,</span> tabell2;</pre></div></div>

<p>Vil resultatet være følgende:</p>
<blockquote><p>[ tall | tall ]</p>
<p>[ 1 | 1 ]</p>
<p>[ 1 | 2 ]</p>
<p>[ 1 | 3 ]</p>
<p>[ 2 | 1 ]</p>
<p>[ 2 | 2 ]</p>
<p>[ 2 | 3 ]</p>
<p>[ 3 | 1 ]</p>
<p>[ 3 | 2 ]</p>
<p>[ 3 | 3 ]</p></blockquote>
<h2><strong>Referanser</strong></h2>
<p>Jeg er særdeles dårlig på norske uttrykk når det gjelder programmering og lignende. Derfor har jeg fått hjelp av boka [i]Databaser[/i] som er skrevet av Kjell Toft Hansen og Tore Mallaug.</p>
]]></content:encoded>
			<wfw:commentRss>http://mikaelb.net/2009/09/liten-innf%c3%b8ring-i-foreninger-join-i-sql/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Tall datatyper i MySQL</title>
		<link>http://mikaelb.net/2008/12/tall-datatyper-i-mysql/</link>
		<comments>http://mikaelb.net/2008/12/tall-datatyper-i-mysql/#comments</comments>
		<pubDate>Thu, 04 Dec 2008 17:33:35 +0000</pubDate>
		<dc:creator>Mikael Brevik</dc:creator>
				<category><![CDATA[Høynivåspråk]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[datatyper]]></category>
		<category><![CDATA[primitive datatyper]]></category>
		<category><![CDATA[sql]]></category>

		<guid isPermaLink="false">http://mikaelb.net/blogg/?p=31</guid>
		<description><![CDATA[I dag har jeg tenkt å gå litt på det banale, men som jeg ser mange er usikre på. Det er rett og slett kopiert direkte fra manualen til MySQL, men det er ikke sikkert alle som finner den eller er klare over det.
For enkelte er det kanskje ikke greit å vite hvilken INT-type man [...]]]></description>
			<content:encoded><![CDATA[<p>I dag har jeg tenkt å gå litt på det banale, men som jeg ser mange er usikre på. Det er rett og slett kopiert direkte fra manualen til MySQL, men det er ikke sikkert alle som finner den eller er klare over det.</p>
<p>For enkelte er det kanskje ikke greit å vite hvilken INT-type man skal ha til tider. Er det <code>TINYINT</code> jeg vil ha? Eler er det kanskje <code>SMALLINT</code>? Hvor går grensen, hvor store verdier?</p>
<p>I manuelen finner vi denne tabellen, som er en temmelig grei oversikt over hvor store verdier du kan ha på de forskjellige INT-typene</p>
<blockquote>
<table class="mceVisualAid" border="0">
<tbody>
<tr>
<td class="mceVisualAid"><span class="bold"><strong>Type</strong></span></td>
<td class="mceVisualAid"><span class="bold"><strong>Bytes</strong></span></td>
<td class="mceVisualAid"><span class="bold"><strong>Minimum Value</strong></span></td>
<td class="mceVisualAid"><span class="bold"><strong>Maximum Value</strong></span></td>
</tr>
<tr>
<td class="mceVisualAid"></td>
<td class="mceVisualAid"></td>
<td class="mceVisualAid"><span class="bold"><strong>(Signed/Unsigned)</strong></span></td>
<td class="mceVisualAid"><span class="bold"><strong>(Signed/Unsigned)</strong></span></td>
</tr>
<tr>
<td class="mceVisualAid"><code class="literal">TINYINT</code></td>
<td class="mceVisualAid">1</td>
<td class="mceVisualAid"><code class="literal">-128</code></td>
<td class="mceVisualAid"><code class="literal">127</code></td>
</tr>
<tr>
<td class="mceVisualAid"></td>
<td class="mceVisualAid"></td>
<td class="mceVisualAid"><code class="literal">0</code></td>
<td class="mceVisualAid"><code class="literal">255</code></td>
</tr>
<tr>
<td class="mceVisualAid"><code class="literal">SMALLINT</code></td>
<td class="mceVisualAid">2</td>
<td class="mceVisualAid"><code class="literal">-32768</code></td>
<td class="mceVisualAid"><code class="literal">32767</code></td>
</tr>
<tr>
<td class="mceVisualAid"></td>
<td class="mceVisualAid"></td>
<td class="mceVisualAid"><code class="literal">0</code></td>
<td class="mceVisualAid"><code class="literal">65535</code></td>
</tr>
<tr>
<td class="mceVisualAid"><code class="literal">MEDIUMINT</code></td>
<td class="mceVisualAid">3</td>
<td class="mceVisualAid"><code class="literal">-8388608</code></td>
<td class="mceVisualAid"><code class="literal">8388607</code></td>
</tr>
<tr>
<td class="mceVisualAid"></td>
<td class="mceVisualAid"></td>
<td class="mceVisualAid"><code class="literal">0</code></td>
<td class="mceVisualAid"><code class="literal">16777215</code></td>
</tr>
<tr>
<td class="mceVisualAid"><code class="literal">INT</code></td>
<td class="mceVisualAid">4</td>
<td class="mceVisualAid"><code class="literal">-2147483648</code></td>
<td class="mceVisualAid"><code class="literal">2147483647</code></td>
</tr>
<tr>
<td class="mceVisualAid"></td>
<td class="mceVisualAid"></td>
<td class="mceVisualAid"><code class="literal">0</code></td>
<td class="mceVisualAid"><code class="literal">4294967295</code></td>
</tr>
<tr>
<td class="mceVisualAid"><code class="literal">BIGINT</code></td>
<td class="mceVisualAid">8</td>
<td class="mceVisualAid"><code class="literal">-9223372036854775808</code></td>
<td class="mceVisualAid"><code class="literal">9223372036854775807</code></td>
</tr>
<tr>
<td class="mceVisualAid"></td>
<td class="mceVisualAid"></td>
<td class="mceVisualAid"><code class="literal">0</code></td>
<td class="mceVisualAid"><code class="literal">18446744073709551615</code></td>
</tr>
</tbody>
</table>
</blockquote>
<p>Dette gir en pekepinne på hvilken type man skal bruke på de forskjellige feltene når du lager en tabell. Det er ikke alt for mye optimalisering å hente på å sette feltene til lavest mulig, men som man sier: «Mange bekker små, gjør en stor å».</p>
]]></content:encoded>
			<wfw:commentRss>http://mikaelb.net/2008/12/tall-datatyper-i-mysql/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>GROUP_CONCAT() med LIMIT</title>
		<link>http://mikaelb.net/2008/12/group_concat-med-limit/</link>
		<comments>http://mikaelb.net/2008/12/group_concat-med-limit/#comments</comments>
		<pubDate>Thu, 04 Dec 2008 17:04:01 +0000</pubDate>
		<dc:creator>Mikael Brevik</dc:creator>
				<category><![CDATA[MySQL]]></category>
		<category><![CDATA[group_concat()]]></category>
		<category><![CDATA[limit]]></category>

		<guid isPermaLink="false">http://mikaelb.net/blogg/?p=19</guid>
		<description><![CDATA[For litt siden kom noen til meg over MSN og lurte på hvordan de kunne bruke GROUP_CONCAT() men bare implodere de 3 nyeste (høyest ID). Og dette ville han da gjøre uten noen loop som helst. Jeg sier til han at han burde bruke PHPs implode()-funksjon, men det ville han visst ikke. MySQL skal vel [...]]]></description>
			<content:encoded><![CDATA[<p>For litt siden kom noen til meg over MSN og lurte på hvordan de kunne bruke GROUP_CONCAT() men bare implodere de 3 nyeste (høyest ID). Og dette ville han da gjøre uten noen loop som helst. Jeg sier til han at han burde bruke <a href="http://no.php.net/implode">PHPs implode()</a>-funksjon, men det ville han visst ikke. MySQL skal vel egentlig ikke brukes til å manipulere date, men heller til å håndtere/deligere/lagre innhold (data).</p>
<p>Uansett tenkte jeg at løsningen måtte være å bruke en subquery, hvor man sjekket at id var i id-ene som ble plukket ut av subqueriet. Nyere versjoner støtter ikke å bruke IN/ALL/ANY/SOME til subqueries i WHERE-clause, så da er løsningen ganske selvsigende.</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
</pre></td><td class="code"><pre class="mysql" style="font-family:monospace;"><span style="color: #990099; font-weight: bold;">SELECT</span>
   <span style="color: #000099;">GROUP_CONCAT</span><span style="color: #FF00FF;">&#40;</span>
      a.id
      <span style="color: #990099; font-weight: bold;">ORDER BY</span> a.id <span style="color: #990099; font-weight: bold;">DESC</span>
      SEPARATOR <span style="color: #008000;">', '</span>
   <span style="color: #FF00FF;">&#41;</span> <span style="color: #990099; font-weight: bold;">as</span> imploded_idfield
<span style="color: #990099; font-weight: bold;">FROM</span> myField a
<span style="color: #990099; font-weight: bold;">INNER</span> <span style="color: #990099; font-weight: bold;">JOIN</span>
   <span style="color: #FF00FF;">&#40;</span>
      <span style="color: #990099; font-weight: bold;">SELECT</span> id
      <span style="color: #990099; font-weight: bold;">FROM</span> myField
      <span style="color: #990099; font-weight: bold;">ORDER BY</span> id <span style="color: #990099; font-weight: bold;">DESC</span>
      <span style="color: #808080; font-style: italic;">-- [WHERE ... ]</span>
      <span style="color: #990099; font-weight: bold;">LIMIT</span> <span style="color: #008080;">3</span>
   <span style="color: #FF00FF;">&#41;</span> b
<span style="color: #990099; font-weight: bold;">ON</span> a.id <span style="color: #CC0099;">=</span> b.id</pre></td></tr></table></div>

<p>Da har vi alle de imploderte verdiene i <code>imploded_idfield</code>, og kan se ut noe som</p>
<blockquote><p>&#8220;300, 299, 298&#8243;</p></blockquote>
]]></content:encoded>
			<wfw:commentRss>http://mikaelb.net/2008/12/group_concat-med-limit/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Finne mest forekommende verdi i et MySQL felt</title>
		<link>http://mikaelb.net/2008/12/finne-mest-forekommende-verdi-i-et-mysql-felt/</link>
		<comments>http://mikaelb.net/2008/12/finne-mest-forekommende-verdi-i-et-mysql-felt/#comments</comments>
		<pubDate>Thu, 04 Dec 2008 16:45:43 +0000</pubDate>
		<dc:creator>Mikael Brevik</dc:creator>
				<category><![CDATA[MySQL]]></category>
		<category><![CDATA[count]]></category>
		<category><![CDATA[group by]]></category>

		<guid isPermaLink="false">http://mikaelb.net/blogg/?p=15</guid>
		<description><![CDATA[I sammenhengen med en DVD-liste jeg lagde en gang i tiden, la jeg til noe statistikk for moro skyld. Der fant jeg ut at jeg ville finne ut hvilken sjanger jeg ser mest av, og eier mest av. Derfor måtte jeg finne den verdien som forekommer oftest i et felt.
Jeg tenkte det kunne være litt [...]]]></description>
			<content:encoded><![CDATA[<p>I sammenhengen med en DVD-liste jeg lagde en gang i tiden, la jeg til noe statistikk for moro skyld. Der fant jeg ut at jeg ville finne ut hvilken sjanger jeg ser mest av, og eier mest av. Derfor måtte jeg finne den verdien som forekommer oftest i et felt.</p>
<p>Jeg tenkte det kunne være litt kjekt å fått denne servert i fanget, da den kan komme til nyttighet for noen senere. Dette er nesten samme som da jeg skulle finne motsatte av destinkte verdier.</p>
<p>Så den jeg lagde, ble noe slik som den her:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
</pre></td><td class="code"><pre class="mysql" style="font-family:monospace;"><span style="color: #990099; font-weight: bold;">SELECT</span> 
   <span style="color: #000099;">COUNT</span><span style="color: #FF00FF;">&#40;</span> id <span style="color: #FF00FF;">&#41;</span> <span style="color: #990099; font-weight: bold;">AS</span> quantity<span style="color: #000033;">,</span> field_name
<span style="color: #990099; font-weight: bold;">FROM</span> <span style="color: #990099; font-weight: bold;">table</span>
<span style="color: #990099; font-weight: bold;">GROUP BY</span> field_name
<span style="color: #990099; font-weight: bold;">ORDER BY</span> quantity <span style="color: #990099; font-weight: bold;">DESC</span>
<span style="color: #990099; font-weight: bold;">LIMIT</span> <span style="color: #008080;">1</span></pre></td></tr></table></div>

<p>Så her er <code>FIELD</code> feltet som du teller opp i, og id er unike id til tabellen. Her vil du få noe resultat som dette:</p>
<pre>quantity  - field
1233      - value</pre>
<p>Håper dere finner den nyttig.</p>
<p>PS/Tips: Om dere vil ha full statistikk over forskjellige verdier og hvor mange det forekommer av de. Kan være kjekt for statistikk-applikasjoner for å telle forskjellige besøk av forskjellige IP-adresser.</p>
]]></content:encoded>
			<wfw:commentRss>http://mikaelb.net/2008/12/finne-mest-forekommende-verdi-i-et-mysql-felt/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Motsatte av distincte verdier i MySQL</title>
		<link>http://mikaelb.net/2008/12/motsatte-av-distincte-verdier-i-mysql/</link>
		<comments>http://mikaelb.net/2008/12/motsatte-av-distincte-verdier-i-mysql/#comments</comments>
		<pubDate>Thu, 04 Dec 2008 16:32:56 +0000</pubDate>
		<dc:creator>Mikael Brevik</dc:creator>
				<category><![CDATA[MySQL]]></category>
		<category><![CDATA[distinct]]></category>
		<category><![CDATA[subqueries]]></category>

		<guid isPermaLink="false">http://mikaelb.net/blogg/?p=9</guid>
		<description><![CDATA[Satt å vridde hodet litt på denne oppgaven fra NWF i dag. Der målet var å printe alle brukernavn med lik IP adresse i en tabell i MySQL. Trodde jeg hadde full orden på det når jeg skrev denne spørringen:

1
2
3
4
5
6
7
8
9
10
SELECT user
FROM users
WHERE ip
   IN &#40;
        SELECT [...]]]></description>
			<content:encoded><![CDATA[<p>Satt å vridde hodet litt på <a href="http://norskwebforum.no/viewtopic.php?t=29940">denne oppgaven fra <acronym title="Norsk WebForum">NWF</acronym></a> i dag. Der målet var å printe alle brukernavn med lik <acronym title="Internet Protocol">IP</acronym> adresse i en tabell i MySQL. Trodde jeg hadde full orden på det når jeg skrev denne spørringen:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
</pre></td><td class="code"><pre class="mysql" style="font-family:monospace;"><span style="color: #990099; font-weight: bold;">SELECT</span> <span style="color: #000099;">user</span>
<span style="color: #990099; font-weight: bold;">FROM</span> users
<span style="color: #990099; font-weight: bold;">WHERE</span> ip
   <span style="color: #990099; font-weight: bold;">IN</span> <span style="color: #FF00FF;">&#40;</span>
        <span style="color: #990099; font-weight: bold;">SELECT</span> ip
        <span style="color: #990099; font-weight: bold;">FROM</span> users
        <span style="color: #990099; font-weight: bold;">GROUP BY</span> ip
        <span style="color: #990099; font-weight: bold;">HAVING</span> <span style="color: #000099;">COUNT</span><span style="color: #FF00FF;">&#40;</span>ip<span style="color: #FF00FF;">&#41;</span> <span style="color: #CC0099;">&amp;</span>gt<span style="color: #000033;">;</span> <span style="color: #008080;">1</span>
       <span style="color: #FF00FF;">&#41;</span>
<span style="color: #990099; font-weight: bold;">ORDER BY</span> <span style="color: #000099;">user</span></pre></td></tr></table></div>

<p>Den spørringen der skulle etter all min logiske sans fungere ypperlig. Noe som den egentlig gjør. Det hadde jeg funnet ut, om jeg ikke tabbet meg fullstendig ut på PHP fronten.</p>
<p>Vell, tenkte jeg skulle dele dette med dere. Om dere kommer over samme oppgave. Slik er det altså dere finner motsatte av distinct i MySQL.</p>
<p>Er det av ønske å komplisere spørringen litt, så fant jeg også ut av denne, under prosessen:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
</pre></td><td class="code"><pre class="mysql" style="font-family:monospace;"><span style="color: #990099; font-weight: bold;">SELECT</span> u.<span style="color: #000099;">user</span>
<span style="color: #990099; font-weight: bold;">FROM</span> users u
   <span style="color: #990099; font-weight: bold;">INNER</span> <span style="color: #990099; font-weight: bold;">JOIN</span> <span style="color: #FF00FF;">&#40;</span><span style="color: #990099; font-weight: bold;">SELECT</span> ip
                      <span style="color: #990099; font-weight: bold;">FROM</span> users
                      <span style="color: #990099; font-weight: bold;">GROUP BY</span> ip
                      <span style="color: #990099; font-weight: bold;">HAVING</span> <span style="color: #000099;">COUNT</span><span style="color: #FF00FF;">&#40;</span>ip<span style="color: #FF00FF;">&#41;</span> <span style="color: #CC0099;">&gt;</span> <span style="color: #008080;">1</span><span style="color: #FF00FF;">&#41;</span> d
   <span style="color: #990099; font-weight: bold;">ON</span> u.ip <span style="color: #CC0099;">=</span> d.ip
<span style="color: #990099; font-weight: bold;">ORDER BY</span> <span style="color: #000099;">user</span></pre></td></tr></table></div>

]]></content:encoded>
			<wfw:commentRss>http://mikaelb.net/2008/12/motsatte-av-distincte-verdier-i-mysql/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Søking i en MyISAM-database</title>
		<link>http://mikaelb.net/2008/05/soking-i-en-myisam-database/</link>
		<comments>http://mikaelb.net/2008/05/soking-i-en-myisam-database/#comments</comments>
		<pubDate>Sun, 04 May 2008 16:41:52 +0000</pubDate>
		<dc:creator>Mikael Brevik</dc:creator>
				<category><![CDATA[MySQL]]></category>
		<category><![CDATA[against]]></category>
		<category><![CDATA[fulltext]]></category>
		<category><![CDATA[like]]></category>
		<category><![CDATA[match]]></category>
		<category><![CDATA[myisam]]></category>
		<category><![CDATA[rlike]]></category>
		<category><![CDATA[søk]]></category>

		<guid isPermaLink="false">http://mikaelb.net/blogg/?p=13</guid>
		<description><![CDATA[Topp notis: FULLTEXT-metoden som er brukt i denne artikkelen støttes ikke av database-typen InnoDB, men MyISAM.
Det er flere metoder du kan bruke når du skal søke i en MySQL database. De vanligste metodene er å bruke LIKE() eller MATCH(). Her vil jeg forklare en bruk av MATCH, og så vidt nevne LIKE/RLIKE. MATCH bruker vi [...]]]></description>
			<content:encoded><![CDATA[<p><em>Topp notis</em>: FULLTEXT-metoden som er brukt i denne artikkelen støttes ikke av database-typen InnoDB, men MyISAM.</p>
<p>Det er flere metoder du kan bruke når du skal søke i en MySQL database. De vanligste metodene er å bruke LIKE() eller MATCH(). Her vil jeg forklare en bruk av MATCH, og så vidt nevne LIKE/RLIKE. MATCH bruker vi i noe som kalles <code>FULLTEXT</code> search. Det betyr at du må ha en <code>FULLTEXT</code>-index i tabellen din.</p>
<p>Dette kan du gjøre eks via CREATE eller ALTER. Når du lager en ny tabell kan du f.eks gjøre slik:</p>

<div class="wp_syntax"><div class="code"><pre class="mysql" style="font-family:monospace;"><span style="color: #990099; font-weight: bold;">CREATE</span> <span style="color: #990099; font-weight: bold;">TABLE</span> <span style="color: #990099; font-weight: bold;">table</span> <span style="color: #FF00FF;">&#40;</span>
   news_id <span style="color: #999900; font-weight: bold;">INT</span> <span style="color: #FF9900; font-weight: bold;">UNSIGNED</span> <span style="color: #FF9900; font-weight: bold;">AUTO_INCREMENT</span> <span style="color: #990099; font-weight: bold;">PRIMARY KEY</span><span style="color: #000033;">,</span>
   my_title <span style="color: #999900; font-weight: bold;">VARCHAR</span><span style="color: #FF00FF;">&#40;</span><span style="color: #008080;">200</span><span style="color: #FF00FF;">&#41;</span><span style="color: #000033;">,</span>
   my_text <span style="color: #999900; font-weight: bold;">TEXT</span><span style="color: #000033;">,</span>
   <span style="color: #FF9900; font-weight: bold;">FULLTEXT</span> <span style="color: #FF00FF;">&#40;</span>my_title<span style="color: #000033;">,</span> my_text<span style="color: #FF00FF;">&#41;</span>
<span style="color: #FF00FF;">&#41;</span><span style="color: #000033;">;</span></pre></div></div>

<p><code>FULLTEXT</code> skal asignes til de feltene som du vil MATCH skal fungere på.</p>
<h3>Så hvordan søker vi?</h3>
<p>Si at jeg har mye innhold i tabellen ovenfor som handler om elefanter og blåbær.</p>
<p>Så skal jeg plukke ut de artiklene som inneholder nettopp ordene &#8220;elefant&#8221; og &#8220;blåbær&#8221;. Da gjør jeg slik:</p>

<div class="wp_syntax"><div class="code"><pre class="mysql" style="font-family:monospace;"><span style="color: #990099; font-weight: bold;">SELECT</span> id<span style="color: #000033;">,</span> my_title<span style="color: #000033;">,</span>
   <span style="color: #990099; font-weight: bold;">MATCH</span><span style="color: #FF00FF;">&#40;</span>my_title<span style="color: #000033;">,</span> my_text<span style="color: #FF00FF;">&#41;</span>
   AGAINST<span style="color: #FF00FF;">&#40;</span><span style="color: #008000;">'elefant blåbær'</span><span style="color: #FF00FF;">&#41;</span> <span style="color: #990099; font-weight: bold;">as</span> relevance
<span style="color: #990099; font-weight: bold;">FROM</span> <span style="color: #990099; font-weight: bold;">table</span>
  <span style="color: #990099; font-weight: bold;">WHERE</span>
     <span style="color: #990099; font-weight: bold;">MATCH</span><span style="color: #FF00FF;">&#40;</span>my_title<span style="color: #000033;">,</span> my_text<span style="color: #FF00FF;">&#41;</span>
     AGAINST<span style="color: #FF00FF;">&#40;</span><span style="color: #008000;">'elefant blåbær'</span><span style="color: #FF00FF;">&#41;</span>
<span style="color: #990099; font-weight: bold;">ORDER BY</span> relevance <span style="color: #990099; font-weight: bold;">DESC</span></pre></div></div>

<p>Her rekner du ut rel som relevanse over hvor mye det stemmer, og vi sorterer etter mest relevante søk, fra størst til minst. Vi velger ut ID, tittel og relevanse.</p>
<p>Det blir ingen videre utgreing av dette, det er selvforklarende.</p>
<h3>Kjapt om LIKE()</h3>
<p>Her kommer det også litt kjapt om hvordan du kan bruke LIKE. Her er det essensielt med wildcardet % for å matche mot resultat.</p>
<p>Her er det korrekt med eksempelet ovenfor:</p>

<div class="wp_syntax"><div class="code"><pre class="mysql" style="font-family:monospace;"><span style="color: #990099; font-weight: bold;">SELECT</span> id<span style="color: #000033;">,</span> my_title
<span style="color: #990099; font-weight: bold;">FROM</span> <span style="color: #990099; font-weight: bold;">table</span>
<span style="color: #990099; font-weight: bold;">WHERE</span> my_text <span style="color: #CC0099; font-weight: bold;">LIKE</span> <span style="color: #FF00FF;">&#40;</span><span style="color: #008000;">'<span style="color: #008080; font-weight: bold;">%</span>elefant<span style="color: #008080; font-weight: bold;">%</span>blåbær<span style="color: #008080; font-weight: bold;">%</span>'</span><span style="color: #FF00FF;">&#41;</span>
<span style="color: #CC0099; font-weight: bold;">AND</span> my_text <span style="color: #CC0099; font-weight: bold;">RLIKE</span> <span style="color: #008000;">'[[:&amp;lt; :]]elefant[[:&amp;gt;:]].*[[:&amp;lt; :]]blåbær[[:&amp;gt;:]]'</span></pre></div></div>

<p>&#8230; Eventuelt utvide med å søke i <code>my_title</code> også!</p>
<h4>Redigert &#8211; 06.07.07 02:38:</h4>
<p>Ser jeg har mangel på forklaring av hva RLIKE gjør, som kan forvirre litt. RLIKE fungerer på samme måte som LIKE gjør, bare at det er med <a title="Hvordan lage regulære uttrykk" href="http://mikaelb.net/2007/hvordan-lage-regulaere-uttrykk/">regulære uttrykk</a>. På den måten får du mye større muligheter til hva du skal hente ut, og ikke bare benytte deg av wildcard.</p>
]]></content:encoded>
			<wfw:commentRss>http://mikaelb.net/2008/05/soking-i-en-myisam-database/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
