 |
ต้องการใส่ ORDER BY id เพิ่มในคำสั่งที่ใช้อัพเดตฐานข้อมูลครับ |
|
 |
|
|
 |
 |
|
ทำได้ด้วยหรอครับ ตาม command
update ทีเดียว 2 table โดยใช้ command เดียวหรือครับ
table test
table down ?
|
 |
 |
 |
 |
Date :
2014-06-25 17:56:47 |
By :
progamer2000 |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
ถามจากคนในนี้แหละครับ เป็นการเปรียบเทียบ 2 table แต่อัพเดต filed เดียวครับ
|
 |
 |
 |
 |
Date :
2014-06-25 18:41:36 |
By :
pmm |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
SET test.status=1 อัพเดท table เดียวครับ เพราะ set อ้างแค่ table เดียว
แต่ถ้า Set test.status=1, down.otherField=null, table3.fieldname='5555' อันนี้ ก็อัพเดท สาม table ครับ
ลองดูได้เลยครับ ใส่ where clause เลือกได้อย่างไร ก็ ใส่ where clause update ได้ตามนั้นครับ
|
 |
 |
 |
 |
Date :
2014-06-25 20:54:04 |
By :
Chaidhanan |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
แล้วผมจะเอาแค่ข้อมูลล่าสุดโดยอิงจาก id จะทำยังไงครับ ลอง order by id desc limit 0,1 ไม่ได้ครับผทติดตรงนี้ครับ 
|
 |
 |
 |
 |
Date :
2014-06-25 21:07:50 |
By :
pmm |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
limit 1 ก็พอครับ
|
 |
 |
 |
 |
Date :
2014-06-25 21:13:22 |
By :
Chaidhanan |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
แต่ผมว่าน่าจะผิดด้าน หน้า มากกว่าครับ ลองเอาโค๊ดทั้งหมดมาดูครับ
และถ้ามี error ก็เอามาดูด้วยก็จะดีมากๆ ครับ จะได้เห็นปัญหาว่ามันอะไรกันแน่
|
 |
 |
 |
 |
Date :
2014-06-25 21:14:49 |
By :
Chaidhanan |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
โค้ดไม่ผิดนะครับ ผมใช้เท่านั้นสามารถทำงานได้เพียงแต่มันอัพเดตทุกฟิลที่ตรงกับเงื่อนไขผมต้องการให้มันอัพเดตตัวล่าสุดตัวเดียวครับผม
|
 |
 |
 |
 |
Date :
2014-06-25 21:18:27 |
By :
ppp |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
อัพเดท ใช้ order by ไม่ได้ครับ
ีupdate table set field=data where id=(select max(id) from table)
|
 |
 |
 |
 |
Date :
2014-06-25 21:21:48 |
By :
Chaidhanan |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
ขอบคุณครับกำลังลองมั่วอยู่ครับ ใส่ไม่ถูก 
|
 |
 |
 |
 |
Date :
2014-06-25 21:37:31 |
By :
ppp |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
แต่ตัวอย่างที่ผมทำให้ดู มันจะมีปัญหา กรณีที่มีคนอื่น insert ไปก่อนที่เราจะทำนะครับ
ไม่เหมาะที่จะทำครับ ควรที่จะรู้ ว่า id อะไร ถึงจะไม่มีข้อผิดพลาดครับ
|
 |
 |
 |
 |
Date :
2014-06-25 21:39:56 |
By :
Chaidhanan |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
มันเป็นของ user ตอนอัพเดตน่ะครับ แต่ละคนจะมี username ของตัวเองอยู่แล้ว น่าจะได้อยู่มั้งครับแฮะๆ แต่ตอนนี้ผมลองทำยังไม่ได้เลยครับ ถ้ารบอีกนิดช่วยเขียนให้เลยได้ไหมครับ ผมทำกี่ทีมันก็อัพเดตหมดเลย =_=
ตัวอย่าง
table test
id status um
1 0 XXX
2 0 XXXX
3 0 XXX
4 0 XXX
5 0 XXX
ให้หา XXX แล้วเปลี่ยน status ของตัวที่เจอเฉพาะ id มากสุด ให้เป็น 1
จะได้เป็น
id status um
1 0 XXX
2 0 XXXX
3 0 XXX
4 0 XXX
5 1 XXX
โค้ดที่ผมลองมั่วๆ บางทีทำก็ไม่ได้ไรเลยบางทีทำก็ได้แบบนี้ครับ
id status um
1 1 XXX
2 0 XXXX
3 1 XXX
4 1 XXX
5 1 XXX
|
 |
 |
 |
 |
Date :
2014-06-25 21:52:50 |
By :
ppp |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
update test set status=1 where id=(select id from test where um='xxx' order by id desc limit 1)
หรือ
update test set status=1 where id=(select max(id) from test where um='xxx')
ใช้ได้ทั้งสองแบบ ครับ
|
 |
 |
 |
 |
Date :
2014-06-25 22:06:34 |
By :
Chaidhanan |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
ลองดูแบบนี้ครับ
UPDATE test SET test.status=1 WHERE test.id = ( select max(t1.id) from test t1, down t2 where t2.sp='spt' AND t2.um = t1.um)
|
 |
 |
 |
 |
Date :
2014-06-25 22:12:21 |
By :
sakuraei |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
#1093 - You can't specify target table 'test' for update in FROM clause
ขึ้นแบบนี้หมดเลยครับ 
โค้ดนี้เอามาเพิ่มจากโค้ดเก่าที่ผมสอบถามจากกระทู้นี้ครับ
https://www.thaicreate.com/php/forum/109106.html
โค้ดเป็นแบบนี้
UPDATE user,log SET log.status=1 WHERE log.transaction='$transaction_id' AND log.username = user.username
โค้ดด้านบน ถ้าใน table log มี ฟิล username และ transaction ที่เหมือนๆกัน มันจะอัพเดต status เป็น 1 ให้หมด ผมต้องการแค่ตัวล่าสุดโดยอิงจาก id ครับผม
|
ประวัติการแก้ไข 2014-06-25 22:27:14
 |
 |
 |
 |
Date :
2014-06-25 22:19:35 |
By :
ppp |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
เอา statement มาดูครับ พิมพ์ ผิดตรงไหน
|
 |
 |
 |
 |
Date :
2014-06-25 22:23:17 |
By :
Chaidhanan |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
UPDATE test c,(SELECT id FROM test where um='xxx' ORDER BY id DESC LIMIT 1 ) d
SET c.status = 1 WHERE c.id=d.id
อันนี้ได้ชัวร์ครับ ลองแล้ว
|
 |
 |
 |
 |
Date :
2014-06-25 22:34:51 |
By :
Chaidhanan |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
ตอบคุณ Chaidhanan ขึ้นแบบนี้ครับ
#1093 - You can't specify target table 'user' for update in FROM clause
UPDATE user,log SET log.status=1 WHERE log.id = (SELECT MAX(log.id) FROM log,user WHERE log.transaction='XXXXXXXXXX' AND user.username = log.username)
#1093 - You can't specify target table 'log' for update in FROM clause
update log set status=1 where id=(select id from log where transaction='XXXXXXXXXX' order by id desc limit 1)
ตอบคุณ Unidentifier ลองแล้วครับขึ้นแบบนี้
ขึ้นแบบนี้ #1093 - You can't specify target table 'log' for update in FROM clause
UPDATE log SET log.status=1 WHERE log.id = (SELECT MAX(log.id) FROM log,user WHERE log.transaction='XXXXXXXXXX' AND user.username = log.username)
ตอบคุณ Chaidhanan รบกวนอธิบายนิดนึงครับผมแอบงงแฮะๆ เอาไปแก้ไม่ถูก งงพวก test c d อันไหนคืออันไหน ขออภัยด้วยครับ พอดีมือใหม่ -..-
UPDATE test c,(SELECT id FROM test where um='xxx' ORDER BY id DESC LIMIT 1 ) d
SET c.status = 1 WHERE c.id=d.id
|
 |
 |
 |
 |
Date :
2014-06-25 22:38:46 |
By :
ppp |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
UPDATE test c, # c เป็นชื่อสำหรับ table test ตัว แรกครับ
(SELECT id FROM test where um='xxx' ORDER BY id DESC LIMIT 1 ) d # ตัว d นี้เป็น ชื่อเรียก temp result จาก sub query ในวงเล็บครับ
SET c.status = 1 WHERE c.id=d.id
คือ เราจะแยกการทำงานเป็น 2 ส่วน
ส่วนแรกทำในวงเล็บก่อน คิวรี่ หา id ตัวสุดท้ายก่อน เข้าไปเก็บใน Tempolary table
ส่วนที่สอง เอา test มา join temp ที่ได้ ครับ
|
 |
 |
 |
 |
Date :
2014-06-25 22:45:52 |
By :
Chaidhanan |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
ขึ้นแบบนี้ครับผม #1093 - You can't specify target table 't3' for update in FROM clause
|
 |
 |
 |
 |
Date :
2014-06-25 23:15:12 |
By :
ppp |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
ขอช่วยทดลองอีกทีได้มั๊ยครับ จะได้หายสงสัย ... ฮ่าๆๆ
UPDATE log as t3 SET t3.status=1 WHERE t3.id = (SELECT MAX(t1.id) FROM log t1,user t2 WHERE t1.transaction='XXXXXXXXXX' AND t2.username = t1.username)
|
 |
 |
 |
 |
Date :
2014-06-25 23:31:47 |
By :
sakuraei |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
ตอบความคิดเห็นที่ : 29 เขียนโดย : sakuraei เมื่อวันที่ 2014-06-25 23:31:47
รายละเอียดของการตอบ ::
ขึ้นแบบเดิมครับ#1093 - You can't specify target table 't3' for update in FROM clause
อันนี้ table log ผมครับ
Code (SQL)
CREATE TABLE IF NOT EXISTS `log` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`username` varchar(255) NOT NULL,
`transaction` varchar(255) NOT NULL,
`status` int(11) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=3 ;
INSERT INTO `log` (`id`, `username`, `transaction`, `status`) VALUES
(1, 'testttt', 'XXXXXXXXXX', 0),
(2, 'testttt', 'XXXXXXXXXX', 0);
|
 |
 |
 |
 |
Date :
2014-06-25 23:46:53 |
By :
ppp |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
|
|