Yorumları: 4.224
Konuları: 379
Kayıt Tarihi: 07-07-2016
Aktif Kullandığınız Delphi Sürümü:
Rep Puanı: 16.975 Üstad
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.
Yorumları: 1.571
Konuları: 88
Kayıt Tarihi: 09-08-2016
Rep Puanı: 13.829 Üstad
23-08-2016, Saat: 17:23
(Son Düzenleme: 23-08-2016, Saat: 17:25, Düzenleyen: SimaWB.)
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
There's no place like 127.0.0.1
Yorumları: 4.224
Konuları: 379
Kayıt Tarihi: 07-07-2016
Aktif Kullandığınız Delphi Sürümü:
Rep Puanı: 16.975 Üstad
23-08-2016, Saat: 17:28
(Son Düzenleme: 23-08-2016, Saat: 17:40, Düzenleyen: TescilsizUzman.)
(23-08-2016, Saat: 17:23)SimaWB Adlı Kullanıcıdan Alıntı: 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
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;
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.
Yorumları: 1.571
Konuları: 88
Kayıt Tarihi: 09-08-2016
Rep Puanı: 13.829 Üstad
Ş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
Yorumları: 4.224
Konuları: 379
Kayıt Tarihi: 07-07-2016
Aktif Kullandığınız Delphi Sürümü:
Rep Puanı: 16.975 Üstad
(23-08-2016, Saat: 22:46)SimaWB Adlı Kullanıcıdan Alıntı: Ş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));
|