Yazar |
|
kereminfo
Moscow
Kayıt: 15.01.2006 |
|
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
afyon
Kayıt: 02.04.2007 |
|
Selam, konuşmalar tablosundaki id'si en büyük olan son konuşma mı oluyor?
|
|
Yazar |
|
extreme
Kahramanmaras
admin
Kayıt: 24.10.2006 |
|
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
Antalya
Kayıt: 05.05.2006 |
|
Ş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
Moscow
Kayıt: 15.01.2006 |
|
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.
[][][][][][][][][][][][][]
|
|
Yazar |
|
clairvoyant
Antalya
Kayıt: 05.05.2006 |
|
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
Moscow
Kayıt: 15.01.2006 |
|
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.
[][][][][][][][][][][][][]
|
|
Yazar |
|
clairvoyant
Antalya
Kayıt: 05.05.2006 |
|
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
Moscow
Kayıt: 15.01.2006 |
|
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 |
Harikasın. Süper oldu. Beni 3 günlük iş yükünden kurtardın walla. Bi yemek borcum var sana. Hiç aklıma gelmedi şu temp tablosu.
[][][][][][][][][][][][][]
|
|
Yazar |
|
clairvoyant
Antalya
Kayıt: 05.05.2006 |
|
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
|
|
| | | | | | |