Tôi có một bảng có tên là products
trong cơ sở dữ liệu MySQL. products
trông giống như sau:SQL: Tìm hàng tiếp theo trong mệnh đề where được cấp ID
id name din strength active deleted
1 APA TEST 00246374 25 1 0
4 APA BOB 00246375 50 1 0
5 APA TIRE 00246888 50 1 0
7 APA ROT 00521414 100 1 0
9 APA APA 01142124 100 1 0
6 APA CODE 00121212 150 1 0
8 APA SERV 00011145 600 1 0
Rõ ràng tôi đã bỏ qua một số cột không quan trọng đối với câu hỏi của mình. Khi tôi truy vấn bảng này, tôi sẽ sắp xếp theo một trong các cột khác nhau (Giao diện người dùng cho phép người dùng cá nhân thay đổi cột sắp xếp và thứ tự) và tôi có thể có một mệnh đề tìm kiếm trong trường hợp này tôi sẽ thực hiện mệnh đề LIKE trên NAME và DIN.
Điều tôi muốn biết là cung cấp thông tin sắp xếp và thông tin tìm kiếm và ID của một sản phẩm cụ thể (Giả sử tôi đã tìm kiếm 004, trả về 3 kết quả và tôi đang xem một trong số các kết quả đó) nhận các sản phẩm tiếp theo và trước đó?
Tôi cần làm điều này, bởi vì nếu người dùng nhấp để chỉnh sửa/xem một trong các sản phẩm sau khi tìm kiếm và sắp xếp kết quả, họ muốn có thể chuyển qua kết quả mà không cần truy cập trang trước.
Có cách nào tốt và hiệu quả để thực hiện việc này trong SQL hay không, tôi có sử dụng PHP tốt nhất không? Bất kỳ ý tưởng cũng được chào đón.
Hiện đang sử dụng truy vấn SQL này, được gặp các vấn đề nếu tôi sắp xếp theo cột strength
như có giá trị nhân bản
SELECT T.*
FROM `wp_products` T
INNER JOIN `wp_products` curr on curr.id = 38
AND ((T.strength = curr.strength and T.id < curr.id)
OR (T.strength > curr.strength))
WHERE T.active = 1 AND T.deleted = 0 AND (T.name LIKE '%%' OR T.din LIKE '%%')
ORDER BY T.strength ASC, T.id ASC
LIMIT 1
mã PHP của tôi (sử dụng WordPress) (Được thiết kế để có được những mục tiếp theo)
$sql = 'SELECT T.*
FROM `' . $wpdb->prefix . 'apsi_products` T
INNER JOIN `' . $wpdb->prefix . 'apsi_products` curr on curr.id = ' . $item->id . '
AND ((T.' . $wpdb->escape($query['orderby']) . ' = curr.' . $wpdb->escape($query['orderby']) . ' and T.id > curr.id)
OR (T.' . $wpdb->escape($query['orderby']) . ' > curr.' . $wpdb->escape($query['orderby']) . '))
WHERE T.active = 1 AND T.deleted = 0 AND (T.name LIKE \'%' . $query['where'] . '%\' OR T.din LIKE \'%' . $query['where'] . '%\')
ORDER BY T.' . $wpdb->escape($query['orderby']) . ' ' . $query['order'] . ', T.id ASC
LIMIT 1;';
Xin lỗi, tôi đã luôn luôn là khủng khiếp với SQL. Tôi có nên để nguyên tham chiếu đến CURR như hiện tại hay tôi nên thay đổi CURR và TABLE thành tên bảng của mình? –
BẢNG là trình giữ chỗ cho tên bảng của bạn. CURR và T là bí danh - để chúng một mình. – RichardTheKiwi
Tôi không thành công nếu không có truy vấn của bạn, nhiều khả năng tôi đang làm điều gì sai. Truy vấn của tôi trông như thế này: 'SELECT * FROM table_name WHERE active = 1 AND deleted = 0 ORDER BY din DESC' và khi tôi chạy truy vấn của bạn, tôi nhận được hàng đầu tiên được trả về bởi truy vấn của tôi mặc dù tôi đang sử dụng ID thứ 5 đã được trả lại . Tôi sẽ lấy ID 38 từ ID thứ 6. Ý tưởng? –