Konuyu görüntüle
IUCODERS FORUM > Programlama > Veritabanları > SQL Yardım?
Yazar
kereminfo


avatar
Moscow
Kayıt: 15.01.2006
21.07.2010-05:57 #70403
Arkadaşlar 3 saat uğraştım yapamadım şu işi. İki tane tablom var.

1. Tablo: Üyeler

ID Adı Tel.
________________
1 | Ahmet | 212
2 | Ayşen | 232
3 | Orhan | 312

2. Tablo: Konuşmalar

ID Uye_id Konusma
________________
1 | 1 | Merhaba
2 | 1 | Selam
3 | 1 | Merhaba
4 | 2 | Selam
5 | 2 | Nasılsın
6 | 2 | Nasılsın
7 | 2 | Selam
8 | 3 | Nasılsın

İstediğim şu: son konuşmaları "Selam yada Merhaba" olan üyelerin adı,telefonu ve konuşmayı aynı tabloda gösteren bir sql cümleciği. Tabloda üye adı tekrarlanmaması lazım.

Sonuç tablosu:

Uye_ID Adı Tel. Konusma
________________
1 | Ahmet | 212 | Merhaba
2 | Ayşen | 232 | Selam

Not: Son konuşmalar yeşil renk(üyeye ait en son eklenen id). Tablolarda 100.000'e yakın veri var. İçiçe select yerine join yapısıyla yapılması lazım.





[][][][][][][][][][][][][]



Yazar
hllgnc


avatar
afyon
Kayıt: 02.04.2007
21.07.2010-09:33 #70404
Selam, konuşmalar tablosundaki id'si en büyük olan son konuşma mı oluyor?





Yazar
extreme


avatar
Kahramanmaras
admin
Kayıt: 24.10.2006
21.07.2010-11:18 #70405
Tabloları şöyle yaptım

CREATE TABLE [dbo].[Uye](
[UYE_Id] [int] IDENTITY(1,1) NOT NULL,
[UYE_Adi] [varchar](50) NULL,
[UYE_Tel] [varchar](50) NULL
)

CREATE TABLE [dbo].[konus](
[KNS_Id] [int] IDENTITY(1,1) NOT NULL,
[KNS_Uye] [int] NULL,
[KNS_Konusma] [varchar](50) NULL
) ON [PRIMARY]

Gerekli view ( Son konuşmanın id sini veren)

create view temp as
select KNS_Uye,MAX(KNS_Id) as KNS_Son from konus
group by KNS_Uye;

sonrasında

select UYE_Id,UYE_Adi,UYE_Tel,KNS_Konusma from temp
left join Uye on temp.KNS_Uye = UYE_Id
left join konus on temp.KNS_Son = konus.KNS_Id
where KNS_Konusma in ('Merhaba','Selam')





The Man Who Loved Algorithm&Ubuntu.
www.burakamasyali.com





Yazar
clairvoyant


avatar
Antalya
Kayıt: 05.05.2006
21.07.2010-15:45 #70406
Şu sorgu işine yarar sanırım:

SELECT Konusmalar.Uye_id, Uyeler.Adi, Uyeler.Tel, Konusmalar.Konusma
FROM Uyeler, Konusmalar
WHERE Konusmalar.ID = (SELECT MAX(ID) FROM Konusmalar GROUP BY Uye_id) AND
	Konusmalar.Konusma IN ('Merhaba', 'Selam') AND
	Konusmalar.Uye_id = Uyeler.ID
ORDER BY Konusmalar.Uye_id ASC






Let`s make this world a better place to live !

Yazar
kereminfo


avatar
Moscow
Kayıt: 15.01.2006
22.07.2010-02:59 #70410
clairvoyant yazdi
 
Şu sorgu işine yarar sanırım:

SELECT Konusmalar.Uye_id, Uyeler.Adi, Uyeler.Tel, Konusmalar.Konusma
FROM Uyeler, Konusmalar
WHERE Konusmalar.ID = (SELECT MAX(ID) FROM Konusmalar GROUP BY Uye_id) AND
	Konusmalar.Konusma IN ('Merhaba', 'Selam') AND
	Konusmalar.Uye_id = Uyeler.ID
ORDER BY Konusmalar.Uye_id ASC


Teşekkürler arkadaşlar.
Kod pratikte çalışıyor. Ama veritabanı çok yüklü. İçiçe select olan bi sorgu gönderince cevap süresi 1dk felan oluyor. Bu sorgulamayı hızlı yapabilmek için sanırım iki tabloyu birleştirdikten sonra birleştirilen tablo üzerinde bi sorgulama yapmak lazım. Ama bulamadım bi yol.

Veritabanı mysql 4 olduğu için VIEW yapısını kullanamıyorum. d oh





[][][][][][][][][][][][][]



Yazar
clairvoyant


avatar
Antalya
Kayıt: 05.05.2006
22.07.2010-16:23 #70423
Evet bu tarz bir sorgu ben de çalıştırdım ve yanıt gelmesi uzun sürdüğü gibi istediğim sonucu da elde edemedim. Fakat şöyle bir şey deneyebilirsin; "Üyeler" tablosuna "SonKonusma_id" gibi bir alan eklersin, böylece içteki sorgudan kurtulmuş olursun. Güzel bir yöntem olup olmadığı tartışılır ama forum sistemlerinde de bu tarz istatistik verileri hazırda tutularak performans arttırılıyor.

WHERE Konusmalar.ID = Uyeler.SonKonusma_id AND
Konusmalar.Konusma IN ('Merhaba', 'Selam') AND
Konusmalar.Uye_id = Uyeler.ID







Let`s make this world a better place to live !

Yazar
kereminfo


avatar
Moscow
Kayıt: 15.01.2006
23.07.2010-01:58 #70434
clairvoyant yazdi
 
Evet bu tarz bir sorgu ben de çalıştırdım ve yanıt gelmesi uzun sürdüğü gibi istediğim sonucu da elde edemedim. Fakat şöyle bir şey deneyebilirsin; "Üyeler" tablosuna "SonKonusma_id" gibi bir alan eklersin, böylece içteki sorgudan kurtulmuş olursun. Güzel bir yöntem olup olmadığı tartışılır ama forum sistemlerinde de bu tarz istatistik verileri hazırda tutularak performans arttırılıyor.

WHERE Konusmalar.ID = Uyeler.SonKonusma_id AND
Konusmalar.Konusma IN ('Merhaba', 'Selam') AND
Konusmalar.Uye_id = Uyeler.ID



Evet bende senin son yazını okumadan önce bu şekilde yapmaya başladım bile. Başka çare bulamadım. Hatta konusma_id'sini değil direk konusmayı tutuyorum. biggrin





[][][][][][][][][][][][][]



Yazar
clairvoyant


avatar
Antalya
Kayıt: 05.05.2006
23.07.2010-04:30 #70436
Aşağıdakini dene bakalım olacak mı? MySQL 5.1'de diğer yöntemle aynı sonucu veriyor. Ama MySQL 4'te çalışır mı bilmiyorum. Eğer çalışırsa yukarıdaki ile aynı sonucu binlerce kat daha hızlı alabileceğini tahmin ediyorum.

SELECT
	Konusmalar.Uye_id, Uyeler.Adi, Uyeler.Tel, Konusmalar.Konusma
FROM
	Uyeler,
	Konusmalar,
	(SELECT MAX(ID) AS ID FROM Konusmalar GROUP BY Uye_id) tmp
WHERE
	Konusmalar.ID = tmp.ID AND
	Konusmalar.Konusma IN ('Merhaba', 'Selam') AND
	Konusmalar.Uye_id = Uyeler.ID
ORDER BY
	Konusmalar.Uye_id ASC






Let`s make this world a better place to live !

Yazar
kereminfo


avatar
Moscow
Kayıt: 15.01.2006
23.07.2010-18:00 #70441
clairvoyant yazdi
 
Aşağıdakini dene bakalım olacak mı? MySQL 5.1'de diğer yöntemle aynı sonucu veriyor. Ama MySQL 4'te çalışır mı bilmiyorum. Eğer çalışırsa yukarıdaki ile aynı sonucu binlerce kat daha hızlı alabileceğini tahmin ediyorum.

SELECT
	Konusmalar.Uye_id, Uyeler.Adi, Uyeler.Tel, Konusmalar.Konusma
FROM
	Uyeler,
	Konusmalar,
	(SELECT MAX(ID) AS ID FROM Konusmalar GROUP BY Uye_id) tmp
WHERE
	Konusmalar.ID = tmp.ID AND
	Konusmalar.Konusma IN ('Merhaba', 'Selam') AND
	Konusmalar.Uye_id = Uyeler.ID
ORDER BY
	Konusmalar.Uye_id ASC


applauseHarikasın. Süper oldu. Beni 3 günlük iş yükünden kurtardın walla. Bi yemek borcum var sana.coffee Hiç aklıma gelmedi şu temp tablosu.





[][][][][][][][][][][][][]



Yazar
clairvoyant


avatar
Antalya
Kayıt: 05.05.2006
25.07.2010-01:18 #70445
Rica ederim. Benim de çözümünü kütüphaneme eklemem gereken bir problemdi bu.





Let`s make this world a better place to live !

Del.icio.us
Digg
Facebook
Furl
Google
Blink
Simpy
Spurl
Y! MyWeb