Bạn nên có hai bảng:một cho cột, một cho phạm vi cột. Với điều đó, một truy vấn đơn giản sẽ truy xuất những gì bạn cần.
CREATE TABLE foo (
foo_id INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
PRIMARY KEY (foo_id)
)
ENGINE=InnoDB;
CREATE TABLE foo_range (
foo_id INT(10) UNSIGNED NOT NULL,
column_from INT(10) UNSIGNED NOT NULL,
column_to INT(10) UNSIGNED NOT NULL,
INDEX foo_range_fk1 (foo_id),
CONSTRAINT foo_range_fk1 FOREIGN KEY (foo_id) REFERENCES foo (foo_id)
)
ENGINE=InnoDB;
INSERT INTO foo(foo_id)
VALUES (1), (2), (3);
INSERT INTO foo_range(foo_id, column_from, column_to)
VALUES (1, 400, 500), (2, 45, 74), (2, 23, 25), (3, 12, 14), (3, 19, 21);
SELECT foo_id
FROM foo_range
WHERE 421 BETWEEN column_from AND column_to;
Và trên thực tế, bảng chính thậm chí không cần thiết trừ khi bạn muốn lưu trữ dữ liệu bổ sung :)
Nếu bạn gặp khó khăn với thiết kế DB khác, có thể bạn sẽ phải truy xuất tất cả các hàng và sử dụng ngôn ngữ phía máy khách của mình để thực hiện đối sánh.