|
|
|
พอดียังไม่กระจ่างเลยต้องมาถามกันใหม่ในเรื่อง select max(id) from .... กับ mysql_insert_id |
|
|
|
|
|
|
|
อนุญาติให้ถามใหม่ครับ
|
|
|
|
|
Date :
2014-01-02 11:40:39 |
By :
เจมสุจิ |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ถ้าหมายถึงจะเลือกไอดีล่าสุดที่เพิ่มแอดเข้าไปแนะนำให้ใช้ mysql_insert_id ครับ (อ่านคำถามแล้วงงหน่อยๆ ไม่รู้ใช่ที่ต้องการรึเปล่า)
|
|
|
|
|
Date :
2014-01-02 14:50:48 |
By :
อนุชา สนู |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
งานมันเสร็จออกมาแล้ว ใช้งานได้ แต่ด้วยความสงสัย เลยทำเป็นรูปมา คำบอกเล่า และคำถามอาจไม่ชัดเจน...
งั้นเอาใหม่ : จะถามว่าอะไรดี ... นึกคำถามไม่ออก จริง ๆ
ลองอธิบายใหม่ หากดูจากรูป เป็นฐานข้อมูลที่สมมุติขึ้นมา
id_auto เป็น auto_increment เริ่มจาก 2556 ถัดไปเป็น 2557 ไปเรื่อย 2558 ... (ไม่เกี่ยวข้องกับ พ.ศ. นะแค่นึกเลขไม่ออกเลยพิมพ์มั่วๆ)
id_want เป็นการสร้างตัวเลขขึ้นแล้ว insert เข้ามา....
คำถาม : แค่อ่านเจอ และ มีหลาย ๆ ท่านแนะนำว่า เลิกใช้ select max(id_auto)+1 เถอะ....ผมก็หาต่อยอด อ่านเพิ่มแต่ยังไม่เคลีย ยังไม่เข้าใจว่า ถ้าไม่ทำแบบนี้จะใช้แบบไหน....
เนื่องจากขึ้น พ.ศ.ใหม่ id_want จะต้องกลับไปใช้เลข 1 ใหม่ ผมก็นึกไม่ออกว่าทำไง...
ก็เลยใช้สิ่งที่คนบอกไม่ควรใช้ คือ select max(id_auto) - 2556 เพื่อให้ได้ตัวเลขเท่ากับ 1
แล้ว insert ลงไปที่ id_want ซึ่งถ้าไม่ทำแบบนี้ จะต้องทำแบบไหนดี....นี่ก็เป็นคำถาม...
ตอบความคิดเห็นที่ : 1 เขียนโดย : เจมสุจิ เมื่อวันที่ 2014-01-02 11:40:39
รายละเอียดของการตอบ ::
หากไม่เข้าใจอย่างไรต้องขออภัยคุณ Guest เจมสุจิ ด้วย ที่ผมอธิบายบอกเล่า และ ตั้งคำถามไม่โดนใจ....
แต่ถ้าเป็นแบบนี้ คุณเจมสุจิ คิดว่า ผมควรตั้งคำถามแบบไหนครับ .... ชี้แนะหน่อย
ตอบความคิดเห็นที่ : 2 เขียนโดย : อนุชา สนู เมื่อวันที่ 2014-01-02 14:50:48
รายละเอียดของการตอบ ::
ก็ยังไม่ใช้สิ่งที่ต้องการครับ
id_auto ผมไม่ไปยุ่งอยู่แล้ว แต่ตอนนี้ลำดับมันไปไกลมาก ผมเลยสมมุติว่ามันไปถึง record ที่ 2556 แต่พอ record ที่ 2557 สิ่งที่ผมต้องการคือ ทำให้ id_want มีค่าเป็น 1 เป็น 2 เป็น 3 ไปเรื่อย
มองง่าย ๆ คือ
id_auto id_want
2556 2556 // มันสิ้นสุดแค่นี้
2557 1 // เริ่มนับ 1
2558 2 //ก็ไล่ไปเรื่อย ๆ
และ จากที่อ่านมาหลายที่ผมยอมรับว่าไม่รู้จะใช้อะไร ก็เลยออกมาถาม ถ้าไม่ได้คำตอบ ผมก็ใช้ select max(id_auto) - 2556 ต่อไป ถามว่าคนใช้รู้ไหม : ก็ไม่รู้
แต่มันค้างคาใจตัวเอง....
ก็ถ้ายังอธิบายไม่โดนใจ guest ทั้งสองสงสัยก็คงจะปล่อยผ่าน....
|
|
|
|
|
Date :
2014-01-02 17:33:46 |
By :
apisitp |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ไม่เกี่ยวกับ พศ. แต่พอขึ้นปีใหม่ ต้องใช้ 1 แล้วทำไมไม่เกี่ยวกับ พศ. ครับ
มันมีแค่ 1 table นี่เหรอครับที่ทำงาน
id_auto ไม่ต้อง max+1 ครับ มัน auto อยู่แล้ว รันไปกัน ได้ค่าเท่ากันไม่ต้องไป select มา
ส่วน id_want ได้มายังไงคับ
|
|
|
|
|
Date :
2014-01-03 11:20:10 |
By :
teez1232002 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
นายเอาโค้ดเอาไปลองรันดูจะ
Create Table (MySQL)
CREATE TABLE MyTable (
ID INT NOT NULL AUTO_INCREMENT,
MyCode VARCHAR(8) NOT NULL,
MyWebsite VARCHAR(32),
PRIMARY KEY (ID)
);
โค้ด Insert แบบใช้ความสามารถของ auto increment
Insert and Generate Code (MySQL)
INSERT INTO MyTable (
MyCode,
MyWebsite
) VALUES (
CONCAT('CODE', LPAD(CONVERT((SELECT AUTO_INCREMENT
FROM information_schema.tables
WHERE table_name='mytable'
AND table_schema = DATABASE()), CHAR(16)), 4, '0')),
'Thaicreate'
);
จะได้แบบนี้
ทีนี้เราสั่ง Insert ไปอีก 6 ครั้งจะได้แบบนี้
คราวนี้เราลองสั่ง Delete record id = 7 (ซึ่งเป็น max id) ดู
Code (SQL)
DELETE FROM MyTable
WHERE ID = 7;
จะได้แบบนี้
================== ต่อไปนี้สำคัญ =====================
ถ้านายใช้ INSERT แบบ max(id) + 1
record ที่ insert ไป มันจะเป็นแบบนี้
ID MyCode MyWebsite
------------------------------------
1 CODE0001 Thaicreate
2 CODE0002 Thaicreate
3 CODE0003 Thaicreate
4 CODE0004 Thaicreate
5 CODE0005 Thaicreate
6 CODE0006 Thaicreate
8 CODE0007 Thaicreate <---- ถ้าเราให้ความสำคัญกับรหัสของข้อมูล ตรงนี้คือข้อผิดพลาด
ซึ่งมันไม่ควรเป็นแบบนี้ เพราะตะกี้เราเพิ่งจะลบ id = 7 ไป
แต่ถ้าเราใช้ insert แบบ auto increment มันจะได้แบบนี้
|
|
|
|
|
Date :
2014-01-03 16:03:21 |
By :
ห้ามตอบเกินวันละ 2 กระทู้ |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
เก็บ log ให้ดูว่ามันใช้งานได้จริง
|
|
|
|
|
Date :
2014-01-03 16:06:08 |
By :
ห้ามตอบเกินวันละ 2 กระทู้ |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ถ้าขึ้น พ.ศ. ใหม่ให้เริ่ม 1 ใหม่ ต้องมีฟิลด์อ้างอิงปี พ.ศ. ด้วยนะครับ
<?php
$sql = "INSERT INTO my_table ................... ";
$insert_id = mysql_insert_id();
$sql = "SELECT COUNT(*) AS max_number FROM my_table
WHERE my_year = '2557' AND id_auto < $insert_id";
?>
เมื่อใช้ SQL คำสั่งที่ 2 เราก็จะได้ตัวเลขในลำดับของเรา โดยไม่สนว่าใครจะ INSERT หลังจากเรา หรือพร้อมกับเรารึเปล่า
เพราะ mysql_insert_id() จะคืนค่าเลข AUTO ที่เป็นของใครของมัน
เมื่อเราเลือกลำดับที่น้อยกว่า ก็จะได้ลำดับก่อนหน้า
|
|
|
|
|
Date :
2014-01-03 16:34:48 |
By :
{Cyberman} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ฝากเอาไว้นิด เพราะคิดว่าเสาร์อาทิตย์เราคงไม่เข้ามาตอบ
เอาเป็นว่าเราเข้าใจที่นายต้องการ แต่เราอยากให้นายเข้าใจสิ่งที่เข้าเขียนข้างบนก่อน
ที่เรามักย้ำตลอดว่า id นั้นสำคัญ ไม่มีใครเข้าเอา id ที่ลบไปแล้วมา reuse ใช้ใหม่หรอก
บัตรเครดิตเราหาย เราขอบัตรใหม่ เรายังไม่ได้เลขบัตรเดิมเลย
user id ก็เหมือนกัน คนละรหัสก็คือคนละ user การเอา max id มาบวก +1 ให้เกิดปัญหา id ซ้ำซ้อน
ถ้าเลี่ยงได้ก็เลี่ยงซะ (ความเห็นว่า guest ต้อยต่ำคนนึง) ส่วนที่เหลือเดี๋ยวมาถกกันต่อไป
|
|
|
|
|
Date :
2014-01-03 16:41:23 |
By :
ห้ามตอบเกินวันละ 2 กระทู้ |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
อาจจะเกิดข้อสงสัยว่า โค๊ดนี้จะทำงานได้ยังไง และต่างกับ MAX(xxx) ปกติที่ใช้
มาดูที่เงื่อนไข WHERE กันก่อนนะครับ
1) my_year = '2557' คือ ต้องการหาเลขลำดับเฉพาะปีปัจจุบัน หรือถ้าเปลี่ยน พ.ศ. ก็หาลำดับเฉพาะ พ.ศ. นั้นๆ
2) AND id_auto < $insert_id คือ การกำหนดว่า หาลำดับก่อนหน้าของแถวที่เพิ่ง INSERT ไปเท่านั้น ไม่ว่าในเสี้ยววินาทีเดียวกัน จะมีใคร INSERT พร้อมเราเราจะไม่นับรวม เพราะมันเป็นรายการที่เกิดหลังเรา เช่น
2.1 เรา INSERT เป็นเรคอร์ดแรกของปีนี้ (auto_id = 111) เราจะ COUNT ได้ 0 เอาไปบวก 1 จะได้ ลำดับ 1
2.2 มีบางคน INSERT พร้อมกับเรา (auto_id = 112) ไม่ว่าเราจะได้อัพเดต want_id เป็น 1 ไปแล้วหรือไม่ก็ตาม รายการที่ 2 นี้จะยังคง COUNT ได้ 1 เพราะเรา INSERT ไปก่อนแล้ว และเมื่อนำมา +1 เรคอร์ดนี้ก็จะได้ want_id เป็น 2
ดังนั้น ไม่ว่าใครจะบันทึกก่อนหลัง เมื่อ COUNT แล้วอ้างอิงเรคอร์ดปัจจุบันของเราก็จะได้ลำดับที่ถูกต้อง
|
|
|
|
|
Date :
2014-01-03 16:47:32 |
By :
{Cyberman} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ระหว่งที่พิมพ์ตอบ...มี คห. เพิ่มขึ้นมา...ขอบคุณอีกครั้งครับ....
เห็นทางออกของอุโมงค์แล้ว เคลียงานหลาย ๆ อย่างเสร็จ
จะรีบออกจากอุโมงค์นี้อย่างเร็วรี่....
|
|
|
|
|
Date :
2014-01-03 16:53:31 |
By :
apisitp |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ผมขอแสดงความคิดเห็นบ้างนะครับ
ถ้าความต้องการ คือ เมื่อวันที่ 1 มกราคม ของปีใดๆ id_want ต้องเป็น 1 เสมอ (ความเข้าใจของผมคือ ในระหว่างปีที่ผ่านมา id_want จะมีค่าเท่าไหร่ไม่รู้ แต่วันที่ 1 มกราคม ต้อง reset ค่าเท่ากับ 1)
ผมจะทำดังนี้ครับ
1. ผมจะเช็ควันเพื่อใช้คำนวณหาค่า id_want ครับ
Code (PHP)
$today = date('Y-m-d');
$next_year = date('Y').'-01-01';
$next_year = date('Y-m-d', strtotime($next_year));
#------ หา id_want -------#
if($today==$next_year){ #ถ้าใช้ก็ให้ id_want เท่ากับ 1
$id_want = '1';
} else {
#ดึงข้อมูล id_want ล่าสุดจาก DB
$getID = mysql_query("SELECT id_want FROM xx ORDER BY id_auto DESC LIMIT 1 ");
$resultID = mysql_fetch_assoc($getID);
#ค่า id_want ที่ได้เพื่อเอาไปบันทึกต่อไป
$id_want = $resultID['id_want']+1;
}
#------ จบหา id_want -------#
2. เมื่อได้ id_want มาแล้วก็ทำการบันทึกข้อมูลลง DB ครับ
Code (PHP)
INSERT INTO xx(id_want) VALUES ($id_want);
ผมคิดว่าน่าจะได้อยู่ และมันน่าจะยืดหยุ่นพอสมควร ไม่รู้ตรงกับความต้องการเปล่า ไม่ตรงก็ผ่านครับ
|
ประวัติการแก้ไข 2014-01-03 17:20:26
|
|
|
|
Date :
2014-01-03 17:19:53 |
By :
arm8957 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ประมาณว่ารัน invoice number ที่มี format อ่านเข้าใจง่ายว่า เดือนไหน ปีใหม่ ใบที่เท่าไหร่ใช่ไหม ถ้าใช่ เดี๋ยวมาเล่นด้วย
|
|
|
|
|
Date :
2014-01-04 03:52:03 |
By :
PlaKriM |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Load balance : Server 04
|