<?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>Coders&#039; Grave &#187; MySQL</title> <atom:link href="http://codersgrave.com/kategori/mysql/feed/" rel="self" type="application/rss+xml" /><link>http://codersgrave.com</link> <description></description> <lastBuildDate>Tue, 11 Dec 2012 17:27:55 +0000</lastBuildDate> <language>tr-TR</language> <sy:updatePeriod>hourly</sy:updatePeriod> <sy:updateFrequency>1</sy:updateFrequency> <generator>http://wordpress.org/?v=3.5</generator> <item><title>MySQL ile Join İşlemleri</title><link>http://codersgrave.com/419-mysql-ile-join-islemleri/</link> <comments>http://codersgrave.com/419-mysql-ile-join-islemleri/#comments</comments> <pubDate>Sat, 28 Aug 2010 12:28:46 +0000</pubDate> <dc:creator>Önder Yüceur</dc:creator> <category><![CDATA[Genel]]></category> <category><![CDATA[MySQL]]></category> <category><![CDATA[inner join]]></category> <category><![CDATA[join]]></category> <category><![CDATA[left join]]></category> <category><![CDATA[mysql]]></category> <category><![CDATA[outer join]]></category> <category><![CDATA[right join]]></category><guid isPermaLink="false">http://www.codersgrave.com/?p=419</guid> <description><![CDATA[Veritabanı kurgusu iki şekilde dizayn edilir; Birincisi allah ne verdiyse önüne, sağına, soluna bakmadan yani kurgusuz ve tembellik sonucu ortaya çıkan&#8230; İkincisi ise daha temkinli, önünü ve arkasını gören, &#8220;Ne olur ne olmaz bunu da koyalım&#8221; veya &#8220;Bunu böyle yaparsak &#8230; <a href="http://codersgrave.com/419-mysql-ile-join-islemleri/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description> <content:encoded><![CDATA[<p>Veritabanı kurgusu iki şekilde dizayn edilir;</p><p>Birincisi allah ne verdiyse önüne, sağına, soluna bakmadan yani kurgusuz ve tembellik sonucu ortaya çıkan&#8230; İkincisi ise daha temkinli, önünü ve arkasını gören, &#8220;<em>Ne olur ne olmaz bunu da koyalım</em>&#8221; veya &#8220;<em>Bunu böyle yaparsak ilerde mıçarız</em>&#8221; önlemler dizisini kavrayan, yani &#8220;<em>Tuvalete oturmadan önce musluğunu kontrol et bence</em>&#8221; deyimini benimsemiş olarak dizayn edendir.</p><p>Bunları şu sebepten söylüyoruz. Günümüzde hala tablolarda boş yere veri tekrarı yapan, düzgün bir başlangıç yapmayan, bazen ise ilişkilendirme işlemlerini abartan yapılandırmalar var. Bu sebepten dolayı JOIN işlemlerinin gerekliliğini önceden iyi tespit edip veritabanı kurgusunu ona göre yapmak gerekmektedir. Bazen aşırı JOIN anahtarına tabi sorgular performans kayıplarına da yol açabilmektedir.</p><p><span id="more-419"></span></p><p>Aşağıdaki örnek bloklar, bu durumu çözen örneklemeler değildir fakat en azından ön ayak olur diye tahmin ediyorum.</p><p>Bir de bir kısım örneklerde A tablosundaki B kolonu şeklindeki saçmalıklar öğrenime katkının tersine daha çok okunduktan sonra sanki ot içmiş Süleyman abi hissine kaptırır. Bunun yerine direk canlı ve gerçek hayatta da kullanılan örneklemelerde bulunacağım.</p><p>Join&#8217;e dalmadan önce ilişkili tablolar nasıl olur bi bakalım. Önce egzampıl tablolarımızı oluşturalım. Özellikle tablolara fazla kolon eklemekten kaçındım yoksa kafa bulandıracaktır.</p><pre><code class="prettyprint">--
-- Yazilar
--
CREATE TABLE `article` (
  `id` int(11) NOT NULL auto_increment,
  `title` varchar(64) NOT NULL,
  `text` text NOT NULL,
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

--
-- Yazilara yapilan yorumlar
--
CREATE TABLE `article_comment` (
  `id` int(11) NOT NULL auto_increment,
  `member_id` int(11) NOT NULL,
  `article_id` int(11) NOT NULL,
  `message` varchar(64) NOT NULL,
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

--
-- Yazilara yapilan yorumlari begenenler
--
CREATE TABLE `article_comment_liked` (
  `id` int(11) NOT NULL auto_increment,
  `member_id` int(11) NOT NULL,
  `article_comment_id` int(11) NOT NULL,
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

--
-- Uyeler
--
CREATE TABLE `member` (
  `id` int(11) NOT NULL auto_increment,
  `firstname` varchar(64) NOT NULL,
  `lastname` varchar(64) NOT NULL,
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;</code></pre><p>Tablolar tamamdır. Yazının devamındaki örneklerde kullanmak için içlerini aşağıdaki kod bloğunu kullarak dolduralım. Bir de script içerisindeki comment çekilmiş bölümleri de okumanızı tavsiye ederim.</p><pre><code class="prettyprint">--
-- üye tablosuna bişeyler ekle ama sentez olsun.
-- id ler auto increment ama ben örneklerde rahat kullanabilmek için elle veriyorum. 100 serisi üyeler için gelsin
--
INSERT INTO `member` VALUES 
('101', 'Hakkı', 'Bulut'), 
('102', 'Bülent', 'Ersoy'), 
('103', 'Gevrek', 'Abi'), 
('104', 'Tiki', 'Bacı'), 
('105', 'Osmanların', 'Kiracı'), 
('106', 'Sıyrık', 'Gacı'), 
('107', 'Suzan', 'Hacı');


--
-- yazı tablosuna bişeyler ekle
-- id ler auto increment ama ben örneklerde rahat kullanabilmek için elle veriyorum. 200 serisi yazılar için gelsin.
--
INSERT INTO `article` VALUES 
('201', 'Başlık Bir', 'İçerik Bir'), 
('202', 'Başlık İki', 'İçerik İki'), 
('203', 'Başlık Üç', 'İçerik Üç'), 
('204', 'Başlık Dört', 'İçerik Dört'), 
('205', 'Başlık Beş', 'İçerik Beş'), 
('206', 'Başlık Altı', 'İçerik Altı');


--
-- yorum tablosuna bişeyler ekle
-- id ler auto increment ama ben örneklerde rahat kullanabilmek için elle veriyorum. 300 serisi begenenler için gelsin.
--
INSERT INTO `article_comment` VALUES 
('301', '101', '201', 'Olmamış.'), 
('302', '102', '201', 'Olmuş olmuş sadece makamı acem kürdi yap evladım.'), 
('303', '101', '202', 'Tebirkler güzel yazı.'), 
('304', '103', '203', 'Ayyy fecii-bokta paylaştım bunu. Çok güzeeeel.'), 
('305', '104', '203', 'Kızım düzgün yaz o nasıl Türkçe. Yazı güzel bu arada kardeşim.'), 
('306', '105', '204', 'çok iyi de oldu çok güzel iyi oldu taam mı?'), 
('307', '103', '207', 'bu yorum böyle bir blogda nasıl yayınlandı. Savcıların harekete geçmesi gerek.');


--
-- yorumları begenenler tablosuna bişeyler ekle
-- ID'ler otomatik olmasına karşın ben manuel ekleme yaptım. Sıkıntı yok devam.
--
INSERT INTO `article_comment_liked` VALUES 
('1', '101', '301'), 
('2', '101', '302'), 
('3', '102', '301'), 
('4', '103', '304'), 
('5', '103', '305'), 
('6', '103', '306'), 
('7', '104', '306'), 
('8', '105', '302'), 
('9', '106', '301'), 
('10', '106', '303'), 
('11', '107', '304');</code></pre><p>Tablolarda doldu. O zaman asıl meseleye gelmeden son olarak JOIN&#8217;leri bilelim.</p><h3>INNER JOIN</h3><p>INNER JOIN, ilişkilendirildiği diğer tabloyla bire bir bütünlük sağlayarak sonuç döner. Yani INNER JOIN&#8217;inde belirtilen ON koşulundaki kolonun her iki tabloda da eşitlik sağlaması kesinliği esasına dayanır. Sadece JOIN anahtarının kullanılması INNER JOIN ile aynıdır. Kafa bulandıysa aşağıdaki örnekler netleştirecektir.</p><h3>LEFT [OUTER] JOIN</h3><p>LEFT JOIN, ilişkilendirildiği diğer tabloyla bire çok bütünlük sağlayarak sonuç döner. Yani LEFT JOIN&#8217;inde belirtilen tablonun solundaki tablonun koşula uysada uymasa da tüm verilerini getir anlamındadır.</p><h3>RIGHT [OUTER] JOIN</h3><p>RIGHT JOIN de tıpkı LEFT JOIN&#8217;deki gibi ilişkilendirildiği diğer tabloyla bire çok veri sonucu döner. LEFT JOIN&#8217;inden bir farkı yoktur desem yeridir. Sadece tabloyu sorgudaki konumlandırdığınız yer itibariyle ihtiyaç duyulur. Demek oluyorki tablonun sağındaki tüm verileri koşula uysada uymasa da getir.</p><p>İlk önce ne yapmak istediğimizi bilelim ve istediklerimizi sırayla sorgulayalım;</p><h4>201 ID&#8217;li yazıya yapılan yorumlar ve yorumların sahiplerini getir. (INNER JOIN)</h4><p>Bu sorguda yorum tablosunun üye ID&#8217;leriyle üye tablosunun üye ID&#8217;leri birleştiriliyor. Bunun yanında bir de yorum tablosundaki &#8220;201 ID&#8217;li olan yazıların yorumlarını getir&#8221; koşulu ile filterelemiş bulunuyoruz. Ve görüyoruz ki JOIN sayesinde üye tablosundaki yorum sahiplerinin isimlerini de yorumun hemen yanında getirebiliyoruz.</p><pre><code class="prettyprint">-- 201 ID'li yazıya yapılan yorumlar ve yorumların sahiplerini getir.
SELECT
  ac.message,
  m.firstname,
  m.lastname
FROM
  article_comment as ac
INNER JOIN
  member as m
ON
  ac.member_id = m.id
WHERE
  ac.article_id = 201</code></pre><p><strong>Sorgu Sonucu</strong><br /> <a href="http://codersgrave.com/wp-content/uploads/2010/08/Picture-21.png" rel="lightbox[419]" title="201 ID&#039;li yazılara yapılan yorumlar ve sahipleri"><img src="http://codersgrave.com/wp-content/uploads/2010/08/Picture-2-300x451.png" alt="" title="201 ID&#039;li yazılara yapılan yorumlar ve sahipleri" width="300" height="45" class="alignleft size-medium wp-image-519" /></a><br /> <span class="clearFix"></span></p><h4>Sadece yorum yapılmış tüm yazıları getir. (INNER JOIN)</h4><p>Burada GROUP BY anahtarını kullanmadığımız zaman birleştirmeden dolayı yorum yapılmış yazılarda bir tekrar söz konusu olacaktır. Bu sebepten bunu sorguya iliştirdim. Kaldırıp sonucunu görebilirsiniz.</p><pre><code class="prettyprint">-- Sadece yorum yapılmış tüm yazıları getir.
SELECT
  a.*
FROM
  article as a
INNER JOIN
  article_comment as ac
ON
  a.id = ac.article_id
GROUP BY ac.article_id</code></pre><p><strong>Sorgu Sonucu</strong><br /> <a href="http://codersgrave.com/wp-content/uploads/2010/08/Picture-51.png" rel="lightbox[419]" title="Sadece yorum yapılmış tüm yazılar - Sorgu Sonucu"><img src="http://codersgrave.com/wp-content/uploads/2010/08/Picture-5-300x821.png" alt="" title="Sadece yorum yapılmış tüm yazılar - Sorgu Sonucu" width="300" height="82" class="alignleft size-medium wp-image-491" /></a><br /> <span class="clearFix"></span></p><h4>Yorumları like edilmiş (beğenilmiş) yazıları getir. (INNER JOIN)</h4><p>Bu sorguda görüldüğü üzere iki JOIN var. Sebebi ise başlıkta da belirttiğim gibi <strong>YORUMLARI LIKE</strong> edilmiş <strong>YAZILARI</strong> getir. Yani işin içinde artık 3 tablo var. Sorgu sonucunda istediğimiz verinin tablosunu FROM&#8217;a yazdıktan sonra kalan kısmı diğer birleştirmeler&#8230;</p><pre><code class="prettyprint">-- Yorumları like edilmiş (beğenilmiş) yazıları getir.
SELECT
  a.*
FROM
  article as a
INNER JOIN
  article_comment as ac
ON
  ac.article_id = a.id
INNER JOIN
  article_comment_liked as acl
ON
  acl.article_comment_id = ac.id
GROUP BY ac.article_id</code></pre><p><strong>Sorgu Sonucu</strong><br /> <a href="http://codersgrave.com/wp-content/uploads/2010/08/Picture-12.png" rel="lightbox[419]" title="Yorumları like edilmiş yazılar"><img src="http://codersgrave.com/wp-content/uploads/2010/08/Picture-1-300x841.png" alt="" title="Yorumları like edilmiş yazılar" width="300" height="84" class="alignleft size-medium wp-image-524" /></a><br /> <span class="clearFix"></span></p><h4>Yorum yapılmış yazılarla birlikte yorum yapılmamış yazıları da getir. (LEFT [OUTER] JOIN)</h4><p>Bu sorgu tüm yorum yapılmış yazıları getirecek fakat arada yorum yapılmamış yazıların da gelmesini istiyoruz. Bunun için LEFT JOIN kullanmak gerektiğini biliyoruz ve son olarak şunu diyoruz. Sen git bu anahtarın solundaki tabloda ne kadar veri varsa koşula uymasanda getir. Aşağıdaki sorgu sonucunda da gördüğünüz gibi tüm yazılar geldiğinden bu yazılara karşılık gelen yorumlar olmadığından NULL döndürmektedir.</p><pre><code class="prettyprint">-- Yorum yapılmış yazılarla birlikte yorum yapılmamış yazıları da getir.
SELECT
  a.id,
  a.title,
  ac.article_id,
  ac.message
FROM
  article as a
LEFT JOIN
  article_comment as ac
ON
  ac.article_id = a.id</code></pre><p><strong>Sorgu Sonucu</strong><br /> <a href="http://codersgrave.com/wp-content/uploads/2010/08/Picture-111.png" rel="lightbox[419]" title="Picture 1"><img src="http://codersgrave.com/wp-content/uploads/2010/08/Picture-11-300x941.png" alt="" title="Picture 1" width="300" height="94" class="alignleft size-medium wp-image-548" /></a></p><p><span class="clearFix"></span></p><h4>Tüm yazılara yapılmış yorumları yazı var olmasa da getir. (RIGHT [OUTER] JOIN)</h4><p>Bu sorgu tüm yazılara yapılmış yorumları getirecek fakat yazılardan birisi küfürlü olduğundan silinmiş ve o yazıya yapılan yorum da duruyor. Normalde LEFT JOIN anahtarında soldaki tablonun tüm verilerinin gelmesi kuralı vardı. RIGHT JOIN&#8217;de ise sağ taraftaki tablonun koşula uymasa da tüm verilerini getir kuralı söz konusu. Bu sorgu sonucunda önceden küfür dolayısıyla silinmiş bir yazıya yapılan yorum da gelecektir. Fakat yazı NULL olarak dönecektir.</p><pre><code class="prettyprint">-- Tüm yazılara yapılmış yorumları yazı var olmasada getir.
SELECT
  a.id,
  a.title,
  ac.message
FROM
  article as a
RIGHT JOIN
  article_comment as ac
ON
  ac.article_id = a.id</code></pre><p><strong>Sorgu Sonucu</strong><br /> <a href="http://codersgrave.com/wp-content/uploads/2010/08/Picture-31.png" rel="lightbox[419]" title="Tüm yazılara yapılmış yorumları yazı var olmasada getir."><img src="http://codersgrave.com/wp-content/uploads/2010/08/Picture-3-300x751.png" alt="" title="Tüm yazılara yapılmış yorumları yazı var olmasada getir." width="300" height="75" class="alignleft size-medium wp-image-528" /></a><br /> <span class="clearFix"></span></p><p>Bu örneklemeler bu yapı için daha da çoğaltılabilir. Sadece ne istediğimizi önceden bilelim ve kurguyu ona göre yapalım. Yoksa bir zaman sonra tüm yapıyı çöpe atmak gibi bir derdiniz olmasın.</p> ]]></content:encoded> <wfw:commentRss>http://codersgrave.com/419-mysql-ile-join-islemleri/feed/</wfw:commentRss> <slash:comments>6</slash:comments> </item> <item><title>Birkaç Aşamada Türkçe Karakter Sorununa Çözüm</title><link>http://codersgrave.com/58-birkac-asamada-turkce-karakter-sorununa-cozum/</link> <comments>http://codersgrave.com/58-birkac-asamada-turkce-karakter-sorununa-cozum/#comments</comments> <pubDate>Wed, 04 Aug 2010 20:33:05 +0000</pubDate> <dc:creator>Önder Yüceur</dc:creator> <category><![CDATA[HTML]]></category> <category><![CDATA[MySQL]]></category> <category><![CDATA[PHP]]></category> <category><![CDATA[mysql]]></category> <category><![CDATA[türkçe karakter]]></category> <category><![CDATA[utf-8]]></category><guid isPermaLink="false">http://www.codersgrave.com/?p=58</guid> <description><![CDATA[Bu damar meselenin ağlatmadığı, sızlatmadığı yoktur. Uyutmadığı da pek çoktur. Varsa da kendime ağlıyor ve de helal deyip konuya giriyorum. Türkçe karakter meselesi PHP ve MySQL tabanlı işlerde başlı başına bir ya da iki yöntemle her zaman malesef aşılamıyor. Bir &#8230; <a href="http://codersgrave.com/58-birkac-asamada-turkce-karakter-sorununa-cozum/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description> <content:encoded><![CDATA[<p>Bu damar meselenin ağlatmadığı, sızlatmadığı yoktur. Uyutmadığı da pek çoktur. Varsa da kendime ağlıyor ve de helal deyip konuya giriyorum.</p><p>Türkçe karakter meselesi PHP ve MySQL tabanlı işlerde başlı başına bir ya da iki yöntemle her zaman malesef aşılamıyor. Bir kaç yerde bazı bazı ufak dokunuşlar yapmak gerekebiliyor. Basit ve anlaşılır yöntem olan adım adım (sekerekten) yöntemiyle başlayalım.</p><p><strong>1- Tarayıcı bazlı karakter set tanımı</strong></p><p>Browser&#8217;lar web projemiz üstündeki &lt;meta&gt; tagındaki anahtarlardan biri olan <strong>charset</strong>&#8216;te tanımlı olan charset encoding&#8217;i dikkate alır. Eğer buraya bir değer atanmaz ise tarayıcının varsayılan olan character set encoding ayarını baz alarak işlem görecektir.</p><p>Tam bu esnada &#8220;peki charset anahtarına hangi değeri vermeliyizdir? &#8221; sorusu gelmektedir. Bunlardan sadece biri temsili olan iki örnek veriyorum;</p><ul><li>ISO-8859-9 v.b</li><li>UTF-8</li></ul><p>Burada ISO-8859-9 karakter seti lokal bir settir. Yani bu tanımı yaparak içeriğimizde sadece Türkçe karakterin olacağını keskin bir ifadeyle bildirmiş oluyoruz.</p><p><span id="more-58"></span></p><p>Fakat UTF-8 gibi evrensel nitelik taşıyan bir charset&#8217;i baştan tanımlar isek ileride farklı dil içeriklerinde hiç bir sıkıntı yaşamadan ilerlemiş oluruz.</p><p>Hoop ahanda böle</p><pre><code class="prettyprint">&lt;meta http-equiv=&quot;Content-Type&quot; content=&quot;text/html; charset=UTF-8&quot; /&gt;</code></pre><p><strong>2- MySQL müdehalesi</strong></p><p>Oluşturulan bir veritabanının yine evrensel olan <strong>utf-8</strong> karakter set&#8217;ine bağlanması gerekmektedir.</p><pre><code class="prettyprint">CREATE DATABASE `demo`
   CHARACTER SET 'utf8'
   COLLATE 'utf8_general_ci';</code></pre><p>Tablolarda da aynı durum geçerlidir.</p><pre><code class="prettyprint">CREATE TABLE `demo` (
  `id` INTEGER(11) NOT NULL AUTO_INCREMENT,
  `isim` VARCHAR(64) DEFAULT NULL,
  `soyisim` VARCHAR(64) DEFAULT NULL,
  PRIMARY KEY (`id`)
)
ENGINE=MyISAM
CHARACTER SET 'utf8' COLLATE 'utf8_general_ci';</code></pre><p><strong>3- PHP&#8217;de MySQL database seçimi sonrası karakter set sorgusu tanımlama</strong></p><p>PHP üzerinde MySQL bağlantısı sağlayıp database seçimi yaptıktan hemen sonra (SELECT, UPDATE, INSERT işlemleri öncesi) aşağıdaki SET NAMES sorgusunu veritabanınıza göndermeniz yeterli olacaktır.</p><pre><code class="prettyprint">mysql_connect(&quot;host&quot;,&quot;username&quot;,&quot;password&quot;);
mysql_select_db(&quot;demo&quot;);
mysql_query(&quot;SET NAMES 'utf8'&quot;);</code></pre><p><strong>4- PHP editörümüzün varsayılan karakter set&#8217;ini </strong><strong>utf-8 yapma</strong></p><p>PHP kodlarını yazdığımız editörün yazı karakter set&#8217;ini utf-8 yapmamız yukardaki maddelerin yanında işi biraz daha kesinleştirecektir.</p><p>Karşıdan karşıya geçerken önce sola sonra sağa sonra tekrar sola bakın. Görüşmek üzere&#8230;</p> ]]></content:encoded> <wfw:commentRss>http://codersgrave.com/58-birkac-asamada-turkce-karakter-sorununa-cozum/feed/</wfw:commentRss> <slash:comments>3</slash:comments> </item> </channel> </rss>