Извините за запутанное название, не мог придумать лучшего. Позвольте мне объяснить на примере. Существует две таблицы, одна содержит список операционных систем, а другая содержит список различных версий этих операционных систем. Следующая картина прояснит это.
Я могу получить элементы, которые принадлежат / связаны с конкретным os_version, выполнив запрос к нему, как select * from items where os_versions.id = 3
, Однако я также хочу сделать запрос наподобие Android 3.0+, что будет означать Android 3.0 и выше, поэтому этот запрос будет извлекать все элементы с os_version с идентификаторами 3,4,5 и 6 (см. Таблицу). Какой лучший способ сделать это? Можно ли это сделать на самой БД с какими-то изменениями в дизайне таблицы или лучше сделать это в кодах? сейчас я поддерживаю массив для поиска, какие os_versions для pullup для запроса с +, но это выглядит грязно. Какие-либо предложения? Благодарю.
Нет причин сохранять версию в виде строки — вы можете сохранить ее как число, а затем запросить ее, используя математические операторы:
CREATE TABLE OperatingSystem (
id INT PRIMARY KEY,
os VARCHAR(20) NOT NULL
);
CREATE TABLE OS_Versions (
id INT PRIMARY KEY,
os_id INT NOT NULL,
os_version DECIMAL NOT NULL,
CONSTRAINT os_id_fk FOREIGN KEY REFERENCES OperatingSystems (id)
);
Чтобы получить все андроиды выше 3.0:
SELECT CONCAT(os, ' ', FORMAT(os_version, 1))
FROM OperatingSystem os
JOIN OS_Versions osv ON os.id = osv.os_id
Это должно быть в запросе?
Эта функция в PHP будет выполнять сравнение версий, вы можете использовать ее в пользовательском фильтре после выполнения запроса, возможно, сначала просто извлекая весь этот конкретный os_id.
http://php.net/manual/en/function.version-compare.php
В противном случае этот вопрос может дать вам некоторые идеи о том, как обращаться с ним на уровне запроса: