Konuyu Paylaş : facebook gplus twitter

Konuyu Oyla:
  • Derecelendirme: 4/5 - 1 oy
  • 1
  • 2
  • 3
  • 4
  • 5
SQL'i nasıl daha sade yazabilirim?
#1
Merhaba,
Formumuzda Terfi sistemini aktif hale getirmeye çalışıyorum. Bu konuda kendi eklentileri yetersiz kaldığından, SQL ile üye terfilerini yaptırmak istiyorum. 
Çalıştıracağım SQL aşağıdaki gibidir.

UPDATE `mybb_users` SET `usergroup`=8 WHERE (`reputation` BETWEEN 0 AND 5) AND (`usergroup` NOT IN (1,3,4,5,6,7));
UPDATE `mybb_users` SET `usergroup`=9 WHERE (`reputation` BETWEEN 6 AND 10) AND (`usergroup` NOT IN (1,3,4,5,6,7));
UPDATE `mybb_users` SET `usergroup`=10 WHERE (`reputation` BETWEEN 11 AND 15) AND (`usergroup` NOT IN (1,3,4,5,6,7));
UPDATE `mybb_users` SET `usergroup`=11 WHERE (`reputation` BETWEEN 16 AND 20) AND (`usergroup` NOT IN (1,3,4,5,6,7));
UPDATE `mybb_users` SET `usergroup`=12 WHERE (`reputation` > 20) AND (`usergroup` NOT IN (1,3,4,5,6,7));


Yukarıdaki SQL daha sade yazılabilir mi?
Not: Veri tabanı MySQL'dir.
While true do; Hayat döngüsü, kısır değildir! Yapılan bir yanlış, o döngünün dışına çıkmanızı sağlayacaktır.
WWW
Cevapla
#2
CASE kullanmalısınız. Şunun gibi:

UPDATE `mybb_users` 
SET `usergroup`= CASE
 WHEN (`reputation` BETWEEN 0 AND 5) THEN 8
 WHEN (`reputation` BETWEEN 6 AND 10) THEN 9
END
WHERE (`usergroup` NOT IN (1,3,4,5,6,7));


Not: Ezbere yazdım, sorun olabilir Smile
There's no place like 127.0.0.1
WWW
Cevapla
#3
(23-08-2016, Saat: 17:23)SimaWB Adlı Kullanıcıdan Alıntı: Linkleri Görebilmeniz İçin Giriş yap veya Üye OlCASE kullanmalısınız. Şunun gibi:

UPDATE `mybb_users` 
SET `usergroup`= CASE
 WHEN (`reputation` BETWEEN 0 AND 5) THEN 8
 WHEN (`reputation` BETWEEN 6 AND 10) THEN 9
END
WHERE (`usergroup` NOT IN (1,3,4,5,6,7));


Not: Ezbere yazdım, sorun olabilir Smile

Gönderdiğiniz SQL yapısını hemen test ediyorum.

Aşağıdaki gibi çalışıyor.

UPDATE `mybb_users` SET `usergroup`= CASE
WHEN `reputation` > 0 THEN 8 
END
WHERE (`usergroup` NOT IN (1,3,4,5,6,7));

Fakat

WHEN kısmında Between veya AND (`reputation` BETWEEN 0 AND 5) kullanmaya izin vermiyor. Yada ben mi yanlış kullanıyorum acaba?

Hata veren SQL kodu;
UPDATE `mybb_users` SET `usergroup`= CASE
 WHEN (`reputation` BETWEEN 0 AND 5) THEN 8 
END
WHERE (`usergroup` NOT IN (1,3,4,5,6,7));


Hata kodu;
Kod:
Hata
Sabit çözümleme:

Çözümleme sırasında 12 hata bulundu.

Tanınmayan anahtar kelime. (near "CASE" at position 37)
Tanınmayan anahtar kelime. (near "WHEN" at position 44)
Beklenmedik belirteç. (near "(" at position 49)
Beklenmedik belirteç. (near "`reputation`" at position 50)
Tanınmayan anahtar kelime. (near "BETWEEN" at position 63)
Beklenmedik belirteç. (near "0" at position 71)
Tanınmayan anahtar kelime. (near "AND" at position 73)
Beklenmedik belirteç. (near "5" at position 77)
Beklenmedik belirteç. (near ")" at position 78)
Tanınmayan anahtar kelime. (near "THEN" at position 80)
Beklenmedik belirteç. (near "8" at position 85)
Tanınmayan anahtar kelime. (near "END" at position 89)
SQL sorgusu:

UPDATE `mybb_users` SET `usergroup`= CASE WHEN (`reputation` BETWEEN 0 AND 5) THEN 8 END WHERE (`usergroup` NOT IN (1,3,4,5,6,7))

MySQL çıktısı: Belgeler

#1048 - Column 'usergroup' cannot be null

Bu kısacık cümlede, bu kadar hatayı nasıl buldu hayret.  Shy
While true do; Hayat döngüsü, kısır değildir! Yapılan bir yanlış, o döngünün dışına çıkmanızı sağlayacaktır.
WWW
Cevapla
#4
Şimdi evdeyim ve test etme imkanım oluştu.
Bende BETWEEN ile çalıştı. WHEN ile belirtilen koşulların dışında `reputation` kalırsa uyarı veriyor. Yani
WHEN (`reputation` BETWEEN 0 AND 5) THEN 8
 yazdınız diyelim. Peki bu koşulu sağlamayan `reputation`lar ne olacak gibi bir durum var sanırım.  
Mesela aşağıdaki gibi birşey deneseniz çalışır diye düşünüyorum:

UPDATE `mybb_users` SET `usergroup`= CASE
    WHEN (`reputation` BETWEEN 0 AND 5) THEN 8 
    ELSE 9
END
WHERE (`usergroup` NOT IN (1,3,4,5,6,7));
There's no place like 127.0.0.1
WWW
Cevapla
#5
(23-08-2016, Saat: 22:46)SimaWB Adlı Kullanıcıdan Alıntı: Linkleri Görebilmeniz İçin Giriş yap veya Üye OlŞimdi evdeyim ve test etme imkanım oluştu.
Bende BETWEEN ile çalıştı. WHEN ile belirtilen koşulların dışında `reputation` kalırsa uyarı veriyor. Yani
WHEN (`reputation` BETWEEN 0 AND 5) THEN 8
 yazdınız diyelim. Peki bu koşulu sağlamayan `reputation`lar ne olacak gibi bir durum var sanırım.  
Mesela aşağıdaki gibi birşey deneseniz çalışır diye düşünüyorum:

UPDATE `mybb_users` SET `usergroup`= CASE
    WHEN (`reputation` BETWEEN 0 AND 5) THEN 8 
    ELSE 9
END
WHERE (`usergroup` NOT IN (1,3,4,5,6,7));

Merhaba,
Son göndermiş olduğunuz SQL çalıştı. teşekkür ederim.

Özetle;
Aşağıdaki SQL'i

UPDATE `mybb_users` SET `usergroup`=8 WHERE (`reputation` BETWEEN 0 AND 5) AND (`usergroup` NOT IN (1,3,4,5,6,7));
UPDATE `mybb_users` SET `usergroup`=9 WHERE (`reputation` BETWEEN 6 AND 10) AND (`usergroup` NOT IN (1,3,4,5,6,7));
UPDATE `mybb_users` SET `usergroup`=10 WHERE (`reputation` BETWEEN 11 AND 15) AND (`usergroup` NOT IN (1,3,4,5,6,7));
UPDATE `mybb_users` SET `usergroup`=11 WHERE (`reputation` BETWEEN 16 AND 20) AND (`usergroup` NOT IN (1,3,4,5,6,7));
UPDATE `mybb_users` SET `usergroup`=12 WHERE (`reputation` > 20) AND (`usergroup` NOT IN (1,3,4,5,6,7));

Bu şekilde daha sade kullanabiliyoruz.
UPDATE `mybb_users` SET `usergroup`= CASE
   WHEN (`reputation` BETWEEN 0 AND 5) THEN 8
   WHEN (`reputation` BETWEEN 6 AND 10) THEN 9
   WHEN (`reputation` BETWEEN 11 AND 15) THEN 10
   WHEN (`reputation` BETWEEN 16 AND 20) THEN 11
   WHEN (`reputation` > 20) THEN 12
   ELSE -1
END
WHERE (`usergroup` NOT IN (1,3,4,5,6,7));
While true do; Hayat döngüsü, kısır değildir! Yapılan bir yanlış, o döngünün dışına çıkmanızı sağlayacaktır.
WWW
Cevapla

Konuyu Paylaş : facebook gplus twitter



Konu ile Alakalı Benzer Konular
Konular Yazar Yorumlar Okunma Son Yorum
  Soru : MySQL Veritabanı' nda Explode İşlemi Nasıl Yapılır mad85 9 432 22-03-2018, Saat: 21:48
Son Yorum: uparlayan
  Uygun kayıt motoru tercihi nasıl yapılır? Abdullah ILGAZ 16 1.409 13-07-2017, Saat: 09:47
Son Yorum: SimaWB
  MySQL configurasyon nasıl olmalı yhackup 15 4.980 01-10-2016, Saat: 20:57
Son Yorum: Kostebech



Konuyu Okuyanlar: 1 Ziyaretçi