Multiline Query

Tabloda Id=35, 36, 37 satırlarda abc kolonu urfa, maraş, sıvas değerlerini alıyor. Aynı değerleri taşıyan Id=x, x+1, x+2 satırlarını sorgulamak istiyorum. Yani bir satırın abc değerini değil, üç satırın abc değerini (aynı sıra ile) sorgulamak istiyorum. Beklediğim sonuç:
3 , urfa
4 , maraş
5 , sıvas
17 , urfa
18 , maraş
19 , sıvas
Pratik bir yöntem var mı acaba?

for i in range(1,100,3):
 x1=i
 x2=i+1
 x3=i+2

Bu işinizi görür sanıyorum.

Cevap için teşekkürler. Fakat ;

im.execute("select no, sehir from olay")
#seçiminden sonra
im.fetchall()# ???
for no in range(1,100,3):
    x1=no
    x2=no+1
    x3=no+2
    print(x1,x2,x3)

döngüsü ile nasıl bağlantı kuracağımı da belirtebilirmisiniz lütfen. Bildiğim kadarı ile önerdiğiniz döngü 1’den başlayıp 100’e kadar üçer üçer saymayı sağlıyor. Şehir sırası ile nasıl bir bağlantı kurabilirim?

Ben sizi yanlış anlamışım. Ben üçer üçer yazdırmak istediğinizi sandım. Siz üç üç çekip kontrol edin. Pratik yöntemi yok. Ama yine bir for döngüsüyle halledersiniz.

Sorunuzu tam olarak anlayamadım. Acaba tek seferde 3 sorgu birden mi çekmek istiyorsunuz? Eğer öyle ise, yukarıdaki for döngüsüyle birleştirerek şöyle birşey yapabilirsiniz.

for no in range(1,100,3):
    im.execute("SELECT no, sehir FROM olay WHERE no BETWEEN {0} AND {1}".format(no,no+2))
    for i in imlec.fetchall():
        print(i)

Açıklamak gerekirse, BETWEEN operatörü bir aralık belirtir SQL üzerinde. Yani “BETWEEN x AND y” dediğiniz zaman X ve Y aralığındaki değerlere sahip olan verileri seçer. Alternatif kullanım da şöyledir

SELECT no,sehir FROM olay WHERE no >= X AND no <=  Y

Hatta LIMIT operatörünü de kullanabilirsiniz

SELECT no,sehir FROM olay WHERE no >= X LIMIT 3

X’den büyük olan tüm verilerden sadece 3 tanesini getir demek.

Teşekkürler. Soruyu şöyle ifade edeyim: Tablomda 100 satırda, 20 kadar şehir var. Peşpeşe aynı sırada üç şehri kapsayan satırları almak istiyorum. Sıra ile urfa, maraş ve sıvas. Bunun dışındaki sıraları değil. Yani urfa, bursa, edirne sırası ile ilgilenmiyorum. Farzedin ki bir satıcı problemi. satıcılar tüm şehirleri dolaşıyorlar ama ben sırası ile önce urfa,sonra maraş ve sonra da sıvas’a uğrayan satıcıları seçmek istiyorum. Tablomda buna uyan iki adet seri var: Id no’larına göre 3-4-5 ve 17-18-19. satırlar. Bu sorguyu nasıl yazabilirim?

1 Beğeni

Çok teşekkür ederim, buna çalışıyorum.

Sanırım kodlarla şöyle ifade edebiliyorum:

im.execute("select * from olay")
abc = im.fetchall()

for i in abc:
    
    if no = a and sehir = sıvas:
        if no = a-1 and sehir = maraş:
            if no = a-2 and sehir = sıvas:
                print(i) 

Burada no=a noktasında syntax hatası alıyorum, ki zaten bekliyordum. Nasıl yazabilirim bu koşulu?

Sizin yazdığınız bir pseudocode, sözdizimi hatası almanız normal. Sanırım en başta Python’ın temellerini biraz öğrenmelisiniz.

Tabloyu -u-c- iki kere kendisine JOIN edebilirsiniz:

SELECT *
FROM foo f1
INNER JOIN foo f2 ON f.id+1=f2.id
INNER JOIN foo f3 ON f.id+2=f3.id
WHERE ...

Çalışıyorum hocam, teşekkür ederim.

Cevap için teşekkürler. Üzerinde çalışıyorum.

Maalesef çözemedim. Benim python’a (aslında programlama öğrenmeye) yeni başladığımı gözönüne alarak, buradaki “FROM foo f1”," foo f2" ve “foo f3” ve “f.id+1” ifadesindeki “f” in neyi temsil ettiğini açıklayabilirmisiniz lütfen. Anladığım kadarı ile f, f1, f2 ve f3 birer tablo olmalı. Öyle ise," foo" nedir? Cehaletimi hoş görün lütfen.

Anlamadiginiz dil, database’in* konustugu SQL dili. Python ile hic bir alakasi yok.

foo tablo ismi, f1, f2, f3 de alias’lari**. Ayni tabloyu 3 degisik sekilde kullanirken, kullanimlari birbirinden ayirt etmek icin degisik isimler verdik.

*: database=veritabani, tablolarin durdugu yer
**: alias=rumuz. SELECT a, b FROM tablo AS rumuz WHERE rumuz.a + rumuz.b = 42

AS kullanip foo AS f1 deseymisim daha okunakli olabilirmis (ama standartta var miydi hatirlamadim)

1 Beğeni

Teşekkür ederim. Tam istediğim sonucu vermedi ama, oldukça yararlı oldu, fikir verdi.