2011-02-23 3 views
-1

У меня есть две таблицы property_description и property_extras.Confused in mysql query

Таблица property_description выглядит

id location price etc etc 
1 New York 3000 v v 

Таблица property_extras выглядит

property_id extras 
1   12,14,16,167 

Ну вопрос в том, как следует MySQL Query это выглядит возвращать результат, только если по крайней мере один из статистов подобран?

+3

У вас должен быть один ряд за штуку. Не храните структуру данных в базе данных. – Quentin

+0

Итак, 'id' & 'property_id' соответствует набору полей? Значит, у них будет такая же ценность? и вы просто хотите проверить, существует ли запись в 'property_extras' с соответствующим идентификатором? и если да, верните результат или ничего не вернете? –

+0

Вы имеете в виду концепцию «один ко многим»? – brodo

ответ

1

Вы должны в идеале иметь статистов нормализованы как

property_id extra_id 
1   12 
1   14 
... 

Если вы не можете преобразовать структуру базы данных в нечто вроде это, тогда вам нужно что-то сделать (ужасное):

SELECT property_id FROM property_extras WHERE 
    extras LIKE '12,%' OR extras LIKE '%,12,%' OR extras LIKE '%,12' 

Или, если вы можете вставить запятые начала и до конца, как ,12,14,...,, как delphist указывает, просто:

SELECT property_id FROM property_extras WHERE extras LIKE '%,12,%' 
+0

Я все еще рисую дизайн базы данных. Итак, как должен выглядеть запрос, если я использую нормализованный? – brodo

+0

'SELECT * FROM property_description INNER JOIN property_extras ON property_description.id = property_extras.property_id WHERE extra_id = 12'. Вы должны убедиться, что каждый дополнительный элемент связан с каждым свойством не более одного раза, то есть не должно быть одинаковых строк в 'property_extras'. Это намного проще выполнить в нормализованной схеме, так же просто, как установка уникального индекса (или первичного ключа) в обоих полях. –

+0

Да, но как искать запрос, если выбрано более одного exta. Например, выбирают 12,17,34,19,40,90,19. Должен ли я использовать AND? – brodo

0

Вы можете заполнить все строки extras с помощью , в начале и конце строки (например, ,12,14,16,167,)?

Тогда это будет работать отлично

SELECT FROM `property_description` LEFT JOIN `property_extras` WHERE `property_extras`.`extras` REGEXP ',(13|14|166),' 

или

SELECT FROM `property_description` LEFT JOIN `property_extras` WHERE `property_extras`.`extras` REGEXP ',14,' 
+0

, но все же будет недостаток, например. 14 в начале и конце в двух строках, будет выбрано две строки, если честно, я думаю, что база данных не настроена правильно –

+0

Вы можете использовать 'CONCAT (',', property_extras)', но это по-прежнему принципиально очень плохое решение. – cypher

+0

Можно ли использовать REGEXP для больших данных? Скажем, если таблица property_extra имеет более 10 000 000 записей? – brodo

2

Хотя можно с помощью схемы, как это означает, правильный путь для решения проблемы стоит normalize your database