2012-02-26 75 views
5

Tôi có một bảng có hơn 300 000 hàng và tôi cần chọn giá trị cao nhất cho cột 'id'. Thông thường, tôi sẽ làm như sau:PHP chọn giá trị `id` lớn nhất từ ​​bảng MySQL

SELECT id FROM my_table ORDER BY id DESC 

... nhưng điều này sẽ khiến truy vấn chậm và tôi không muốn sử dụng. Có cách nào khác để giải quyết tình huống này không? id là tăng tự động và khóa chính.

Chỉnh sửa sau: Có vẻ như mã đầy đủ của tôi được viết khá tệ, như tôi đã khấu trừ từ nhận xét của bạn. Dưới đây tôi đăng một mẫu mã tôi đang làm việc và các bảng. Bạn có thể đề xuất một cách thích hợp để chèn ID cuối cùng + 1 của table_x trong hai bảng (bao gồm cả table_x chính nó). Tôi phải đề cập rằng kịch bản sẽ chạy nhiều lần.

TABLE_X   TABLE_Y 
------------  ---------- 
id_x | value  id_y | id_x 
------------  ---------- 
    1 | A   1 | 3 
    2 | B    
    3 | C 

<?php 
for($i=0; $i<10; $i++){ 
    $result_x = mysql_query('SELECT id_x FROM table_x ORDER BY id_x DESC'); 
    $row_x = mysql_fetch_array($result_x); 

    $next = $row_x['id_x'] + 1; 
    mysql_query('INSERT INTO table_x(id_x) VALUES("'.$next.'")'); 
    mysql_query('INSERT INTO table_y(id_x) VALUES("'.$next.'")'); 
} 
?> 
+1

'SELECT MAX (id)' – knittl

+1

Um, 'SELECT MAX (id) làm id từ my_table'.id là một PK auto_increment, và do đó được lập chỉ mục vì vậy điều này sẽ rất nhanh. –

+1

tại sao bạn cần id tối đa? –

Trả lời

3

Đây là mã đúng mà bạn phải sử dụng.

mysql_query('INSERT INTO table_x(id_x) VALUES(NULL)'); 
$id = mysql_insert_id(); 
mysql_query("INSERT INTO table_y(id_x) VALUES($id)"); 
+0

Ồ, thật dễ dàng. Đúng, tôi phải sử dụng mysql_insert_id(). Cảm ơn bạn! – Cosmi

+0

Tính năng tăng tự động được sử dụng tự động, không phải theo cách thủ công. Nếu không, bạn sẽ phá vỡ tính nhất quán của cơ sở dữ liệu. Luôn cho phép cơ sở dữ liệu gán id –

-1

Tôi đoán nó chậm vì bạn truy xuất tất cả 300 000 hàng. Thêm LIMIT 1 vào truy vấn.

SELECT id FROM my_table ORDER BY id DESC LIMIT 1 

Hoặc sử dụng toán tử MAX().

13

Hơi tốt hơn:

SELECT id FROM my_table ORDER BY id DESC LIMIT 1 

tốt hơn đáng kể:

SELECT MAX(id) FROM my_table 
+0

Cảm ơn bạn. MAX() là giải pháp! – Cosmi

1

Tùy thuộc vào bối cảnh một trong hai

SELECT id FROM my_table ORDER BY id DESC LIMIT 1 

hoặc mysql_insert_id() trong PHP hoặc (SELECT LAST_INSERT_ID()) trong MySQL

+0

LAST_INSERT_ID() là kết nối cụ thể và do đó chỉ trong các tình huống rất đặc biệt hữu ích. – SteAp

+0

@SteAp Tất nhiên. Mặc dù nó phải nhanh hơn đáng kể, sau đó tìm kiếm 'max()'. Không cần phải downvote ở đây folks. –

+0

Ah, OK, giờ tôi đã hiểu nhận xét của bạn. Nạo! Vui lòng đặt một ghi chú trong câu trả lời của bạn - và tôi sẽ upvote một lần nữa. Nếu chỉ để mở khóa bỏ phiếu cho tôi cho câu trả lời này. – SteAp

0

Như khác nói, bạn nên sử dụng các nhà điều hành MAX:

SELECT MAX(id) FROM my_table ORDER BY id DESC 

Như một quy luật chung của ngón tay cái, luôn luôn giảm lượng hồ sơ trở về từ cơ sở dữ liệu. Cơ sở dữ liệu luôn nhanh hơn so với chương trình ứng dụng của bạn khi hoạt động trên bộ kết quả.

Trong trường hợp của các truy vấn chậm, xin vui lòng cho EXPLAIN thử:

EXPLAIN SELECT id FROM my_table ORDER BY id DESC 

vs

EXPLAIN SELECT MAX(id) FROM my_table ORDER BY id DESC 

GIẢI THÍCH hỏi truy vấn tối ưu MySQL của nó như thế nào nhìn thấy các truy vấn. Tìm trong tài liệu, để tìm hiểu cách đọc đầu ra của nó.

PS: Tôi thực sự thắc mắc, tại sao bạn cần MAX(id). Ngay cả khi ứng dụng của bạn lấy lại giá trị từ cơ sở dữ liệu, nó là vô ích: Một quá trình khác có thể chỉ trong chu kỳ CPU tiếp theo đã chèn một bản ghi mới - và MAX(id) không hợp lệ nữa.

+0

Tôi cần phải chèn ID trong hai bảng và tôi không thể tìm thấy một giải pháp thích hợp. Tôi đã sửa đổi bài đăng của mình, bạn có thể xem xét không? Cảm ơn! – Cosmi

+0

Đầu tiên, chèn các bản ghi chính và lưu kết quả của mysql_insert_id() trong một biến. Sau đó, sử dụng ID chèn thêm hợp lệ vĩnh viễn này trong hai câu lệnh inset tiếp theo. Tất cả trong một kịch bản duy nhất. – SteAp

Các vấn đề liên quan