2011-02-23 106 views
-1

我有两个表property_descriptionproperty_extras混淆mysql查询

property_description看起来像

id location price etc etc 
1 New York 3000 v v 

property_extras看起来像

property_id extras 
1   12,14,16,167 

嘛,问题是如何MySQL查询看起来返回结果只有当群众演员的至少一个匹配?

+3

你应该每行增加一行。不要将数据结构存储在数据库中。 – Quentin 2011-02-23 13:05:54

+0

那么'id'和'property_id'是一组匹配的字段吗?所以他们会有相同的价值权利?你只是想检查一个记录是否存在'property_extras'与一个匹配的ID?如果是的话返回一个结果,否则返回什么? – 2011-02-23 13:07:01

+0

你的意思是“一对多”的概念? – brodo 2011-02-23 13:07:26

回答

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 2011-02-23 13:20:23

+0

'SELECT * FROM property_description INNER JOIN property_extras ON property_description.id = property_extras。property_id WHERE extra_id = 12'。你应该确保每个额外部分与每个属性最多关联一次,也就是说,'property_extras'上应该没有相同的行。在规范化的模式中这很容易完成,就像在两个字段上设置唯一的索引(或主键)一样简单。 – 2011-02-23 13:28:27

+0

是的,但如果不止一个exta被选中,应该如何查询查询。 例如选择12,17,34,19,40,90,19。 我应该使用AND吗? – brodo 2011-02-23 13:39:01

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开始和结束两行,两行将被选中,说实话,我认为数据库设置不正确 – 2011-02-23 13:15:39

+0

你可以使用'CONCAT(',',property_extras)',但这仍然是主要的非常糟糕的解决方案。 – cypher 2011-02-23 13:15:59

+0

使用REGEXP处理大数据可靠吗? 让我们说如果一个table property_extra有超过10 000 000条记录? – brodo 2011-02-23 13:16:52