Find avarage value in MySQL

ปัญหาการใช้ mysql aggregate functions อัพเดทข้อมูลด้วยค่าที่คำนวณได้จากตารางเดิม

ปัญหาการใช้ mysql aggregate functions อัพเดทข้อมูลด้วยค่าที่คำนวณได้จากตารางเดิม
นอกจาก mysql อยากรู้ว่าฐานข้อมูลใดสามารถทำสิ่งต่อไปนี้ได้บ้างครับ หรือต้องไปคอนฟิกอะไรใน mysql ให้มันทำได้

mysql ทำได้:
UPDATE tbl_a SET tbl_a.percent_total = tbl_a.value/tbl_a.total

mysql ทำได้ :
UPDATE tbl_a SET tbl_a.percent_total = tbl_a.value/( SELECT SUM( tbl_each_total.total ) FROM tbl_each_total  )

mysql ทำไม่ได้ :
UPDATE tbl_a SET tbl_a.percent_total = tbl_a.value/( SELECT SUM( a_temp.value ) FROM tbl_a AS a_temp )

จากทั้ง 3 กรณี ทำให้ผมรู้ว่าการอัพเดทข้อมูลใน column ใดๆ โดยการใช้ mysql aggregate functions คำนวณค่าจากตารางเดิม ไม่สามารถทำได้ถึงแม้จะเอาค่ามาจาก column อื่นมาคำนวณก็ตาม ( ถ้าเป็น column เดิมก็พอจะเข้าใจอยู่ว่ามันจะทำให้เกิด infinite loop )

ตอนนี้ผมใช้วิธีแก้ปัญหาโดยการสร้างตารางอื่นมาเก็บ ข้อมูลการคำนวณแล้วค่อยเอาตารางดังกล่าวมาคำนวณใส่ตารางเดิมอีกที

1. ไม่ทราบว่าฐานข้อมูลอื่นสามารถแก้ปัญหานี้ได้มั้ยครับ จากที่ค้นหาในเน็ตยังหาไม่เจอ ?

2. กำลังลองศึกษา PostgreSQL ว่าสามารถทำได้ ไม่ทราบว่าตัวนี้สามารถแก้ปัญหานี้ได้หรือเปล่าครับ ?

ขอบ คุณทุกท่านที่ให้คำชี้แนะครับ

———————————————————————————————

ผมเข้าใจว่าต้องการทำแบบนี้
tbl_a(grp, val, percent_total)
(1, 10, 0)
(1, 20, 0)
(1, 18, 0)
(2, 30, 0)
(2, 45, 0)
(2, 10, 0)

จากข้อมูลตัวอย่าง แต่และ grp ต้องการค่า percent_total
grp 1 มี 3 แถวจะได้ค่า
1: percent_total = 10/(10+20+18)
2: percent_total = 20/(10+20+18)
3: percent_total = 18/(10+20+18)

ถ้าต้องการแบบนี้ สามารถทำได้โดยการ join
UPDATE tbl_a a
JOIN (SELECT grp, SUM(val) sum_val FROM tbl_a GROUP BY grp) b ON a.grp=b.grp
SET a.percent_total = a.val / b.sum_val;

แต่ ถ้าที่ผมพูดมาทั้งหมดไม่ใช่ ต้องการแค่ค่า sum เดียวไปหารทุกตัว
ก็ทำแบบ นี้
UPDATE tbl_a a, (SELECT SUM(val) total_val FROM tbl_a) b
SET a.percent_total = b.total_val;

หวังว่าอ่านแล้ว คงไปประยุกต์ต่อได้นะครับ

http://www.pantip.com/tech/developer/topic/DD2919943/DD2919943.html

Censor word query on MySQL

จากคำสั่ง UPDATE.. ด้านล่าง มันเซ็นเซอร์คำได้เฉพาะตัวอักษรไทยกับภาษาอังกฤษตัวเล็กเท่านั้น แก้ไขยังงัยดีครับให้มันทำเซ็นเซอร์ได้ตามคำที่เราเก็บไว้ในฐานข้อมูล

/*  แก้ไขคำหยาบ */
 UPDATE kks2010_chat
 LEFT JOIN  kks2010_chat_censor_word
 ON ( kks2010_chat.chat_message LIKE  CONCAT('%', kks2010_chat_censor_word.word_word, '%') )
 SET  kks2010_chat.chat_message = REPLACE( kks2010_chat.chat_message,  kks2010_chat_censor_word.word_word, '*' )
 WHERE  kks2010_chat_censor_word.word_word IS NOT NULL

/* ข้อมูล */
 CREATE TABLE `kks2010_chat` (
 `chat_auto_id` int(11) NOT NULL auto_increment,
 `chat_message`  varchar(255) default NULL
 PRIMARY KEY  (`chat_auto_id`)
 )  ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=53 ;

INSERT  INTO `kks2010_chat` VALUES (10, 'fuc* you');
 INSERT INTO  `kks2010_chat` VALUES (11, 'fuc* you');
 INSERT INTO `kks2010_chat`  VALUES (12, 'fuC* you');
 INSERT INTO `kks2010_chat` VALUES (13, 'fuC*  you');
 INSERT INTO `kks2010_chat` VALUES (14, 'fUc* you');
 INSERT  INTO `kks2010_chat` VALUES (15, 'fUc* you');
 INSERT INTO  `kks2010_chat` VALUES (16, 'fUC* you');
 INSERT INTO `kks2010_chat`  VALUES (17, 'fUC* you');
 INSERT INTO `kks2010_chat` VALUES (18, 'Fuc*  you');
 INSERT INTO `kks2010_chat` VALUES (19, 'Fuc* you');
 INSERT  INTO `kks2010_chat` VALUES (20, 'FuC* you');
 INSERT INTO  `kks2010_chat` VALUES (21, 'FuC* you');
 INSERT INTO `kks2010_chat`  VALUES (22, 'FUc* you');
 INSERT INTO `kks2010_chat` VALUES (23, 'FUc*  you');
 INSERT INTO `kks2010_chat` VALUES (24, 'FUC* you');
 INSERT  INTO `kks2010_chat` VALUES (25, 'FUC* you');

CREATE TABLE  `kks2010_chat_censor_word` (
 `word_auto_id` int(11) NOT NULL  auto_increment,
 `word_word` varchar(255) default NULL,
 PRIMARY  KEY  (`word_auto_id`)
 ) ENGINE=MyISAM  DEFAULT CHARSET=utf8  AUTO_INCREMENT=26 ;

INSERT INTO `kks2010_chat_censor_word`  VALUES (10, 'fuc*');
 INSERT INTO `kks2010_chat_censor_word` VALUES  (11, 'fuc*');
 INSERT INTO `kks2010_chat_censor_word` VALUES (12,  'fuC*');
 INSERT INTO `kks2010_chat_censor_word` VALUES (13, 'fuC*');
 INSERT  INTO `kks2010_chat_censor_word` VALUES (14, 'fUc*');
 INSERT INTO  `kks2010_chat_censor_word` VALUES (15, 'fUc*');
 INSERT INTO  `kks2010_chat_censor_word` VALUES (16, 'fUC*');
 INSERT INTO  `kks2010_chat_censor_word` VALUES (17, 'fUC*');
 INSERT INTO  `kks2010_chat_censor_word` VALUES (18, 'Fuc*');
 INSERT INTO  `kks2010_chat_censor_word` VALUES (19, 'Fuc*');
 INSERT INTO  `kks2010_chat_censor_word` VALUES (20, 'FuC*');
 INSERT INTO  `kks2010_chat_censor_word` VALUES (21, 'FuC*');
 INSERT INTO  `kks2010_chat_censor_word` VALUES (22, 'FUc*');
 INSERT INTO  `kks2010_chat_censor_word` VALUES (23, 'FUc*');
 INSERT INTO  `kks2010_chat_censor_word` VALUES (24, 'FUC*');
 INSERT INTO  `kks2010_chat_censor_word` VALUES (25, 'FUC*');

——————————————————————————————-

ขอบคุณครับ ลองหาข้อมูลดู สามารถทำได้แล้วครับ โดยการใช้ BINARY หรือ REGEXP เปลี่ยนจากการ UPDATE.. มาเป็น SELECT แทนครับ ส่วนทางเลือกอื่นก็พอเห็นแนวทางอยู่ครับ ไม่ว่าจะเป็นการสร้าง PROCEDURE หรือ FUNCTION ก็พอช่วยเซ็นเซอร์คำได้

SELECT
 kks2010_chat.chat_auto_id,
 kks2010_chat.ID_MEMBER,
 kks2010_chat.memberName,
 kks2010_chat.realName,
 kks2010_chat.chat_nickname,
 IFNULL(  REPLACE( kks2010_chat.chat_message,  kks2010_chat_censor_word.word_word,'*'),kks2010_chat.chat_message )  chat_message,
 kks2010_chat.chat_ip,
 kks2010_chat.chat_session,
 kks2010_chat.chat_timestamp,
 kks2010_chat_censor_word.word_word
 FROM
 kks2010_chat
 LEFT  JOIN kks2010_chat_censor_word ON (kks2010_chat.chat_message LIKE BINARY  CONCAT('%',kks2010_chat_censor_word.word_word,'%'))

http://www.pantip.com/tech/developer/topic/DD2928467/DD2928467.html

Follow

Get every new post delivered to your Inbox.