2016-11-23 4 views
0

Предположим, у меня есть клиент, который ищет объект с определенной областью. Итак, у меня есть несколько флажков, из которых он может проверить те, которые ему нужны.Лучший способ сохранить несколько флажков, чтобы я мог их легко запросить позже.

<input type="checkbox" name="area[]" value="10" /> 10 
<input type="checkbox" name="area[]" value="20" /> 20 
<input type="checkbox" name="area[]" value="30" /> 30 
<input type="checkbox" name="area[]" value="40" /> 40 
<input type="checkbox" name="area[]" value="50" /> 50 

Это, вероятно, не лучший способ сохранить значения площади, поскольку я хочу легко запросить строки, соответствующие моим критериям. Было бы лучше, чтобы это следующим образом:

<input type="checkbox" name="area_10" value="true" /> 10 
<input type="checkbox" name="area_20" value="true" /> 20 
<input type="checkbox" name="area_30" value="true" /> 30 
<input type="checkbox" name="area_40" value="true" /> 40 
<input type="checkbox" name="area_50" value="true" /> 50 

Так что у меня есть отдельные столбцы в таблице базы данных (area_10, area_20, area_30 и т.д.). Если это оптимальное решение, то будет ли запрос sql искать строки, которые проверили область между 10 и 40?

ответ

0

с данными «все-к-одному», вам необходимо использовать хранилище реляционных данных. вам нужна таблица «area», в которой вы храните области, принадлежащие этому объекту. каждая строка имеет номер области и внешний идентификатор объекта. поэтому вы можете написать объединение, которое будет тянуть много к одной информации и упростить хранение, понимание и запрос.

и пример объединения, который будет тянуть области, которые были выбраны и сохранены для объекта # 1972:

select 
    o.id, o.name, group_concat(a.area) areas 
from 
    objects o left join 
    area a on o.id = a.object_id 
where 
    o.id = 1972; 

EDIT пример того, как выбрать все объекты, которые содержат участки от 30 до 60 лет

select 
    o.id, o.name, group_concat(a.area) areas 
from 
    objects o left join 
    area a on o.id = a.object_id 
where 
    a.area between '30' and '60'; 

и дополнительно площадь равна 90

select 
    o.id, o.name, group_concat(a.area) areas 
from 
    objects o left join 
    area a on o.id = a.object_id 
where 
    a.area = '90'; 
+0

Я понимаю, спасибо , Не могли бы вы дать мне пример того, как выбрать все объекты, содержащие области от 30 до 60, а также площадь, равную 90? –

+0

@patrickferry это, как вы просили (в моем обновленном ответе). – WEBjuju

0

Недостаточно информации для получения оптимального решения, но в основном, если все, что требуется, - это найти все объекты с определенными областями, соответствующими выбранным значениям в клиенте, тогда все, что необходимо на стороне сервера, - это таблица (скажем, objects_table) с двумя столбцами, то есть объектом (или его идентификатором) и его областью.

Серверная сторона получает со стороны клиента список значений, которые были выбраны (например, 10, 20, 40) и, соответственно, строит и запускает простой запрос (не забудьте избежать значений, чтобы избежать возможной инъекции),

SELECT id, area FROM objects_table WHERE area IN (10, 20, 40) 

Поскольку я сомневаюсь области будет иметь хорошие дискретные значения в реальной жизни, я предполагаю, что это либо учебный пример или я неправильно понял вопрос ...