2013-08-27 53 views
0

好吧,所以我创建了一种在线购物服务,并且我有一个需要一个字段来匹配多个其他字段的数据库。他们需要被存储,以便他们可以被忽略并设置为可能在以后查看。我知道设置逗号分隔字段通常是不明智的,但我无法找到更好的方式来跟踪匹配,同时能够将它们分类为单独的列。在mysql中匹配一个列值与多个值

例如,我有25种产品可以出售,并且有10个城市我想出售它们。有些可以运到5个城市,有些可以运到9个城市。现在,如果有人在某个特定城市搜索产品,那么只有这些产品才会显示为仅在该城市可供销售的搜索结果?

有没有人有没有更好的方式做这个没有逗号分隔字段?

回答

0

使用n:n表:

产品表

产品

ID |命名

城市表

城市

ID |命名

映射(超过两列唯一约束,而不是单一的约束):

shipping_information

PRODUCT_ID | city_id

然后,您可以轻松选择某个产品的所有可用城市,或选择所有产品,并将其发运到某个城市。

产品4所有可用的城市:SELECT * FROM cities, shipping_info WHERE cities.id = shipping_info.city_id AND shipping_info.product_id = 4

所有可用的产品,为城市3:SELECT * FROM products,shipping_info WHERE shipping_info.id = 3 AND shipping_info.product_id = products.id

1

我会使用约3-4表:

  1. products - 让每个数据产品
  2. cities - 有相关城市的数据
  3. product_cities - 有产品和城市

如果产品可以被运送到5个城市之间的关系,这将有5行product_cities含有相同product_id和不同city_id

当一个人的搜索,碰到这样的:

SELECT pr.* 
FROM cities AS c 
INNER JOIN product_cities AS pc 
ON c.id = pc.city_id 
INNER JOIN products AS pr 
ON pc.product_id = pr.id 
WHERE c.name LIKE 'New York' 
0
Two way to you will be match one column value with mutiple value using 'case statement' or in statement in where clause like: 

select (case when col1>col2 then col2 else 
      when col1>col4 then col4 else 
      col1 end) as colname, col5 from tablename  

or 

select * form tablename where col11 in (1,2,3) 
0

让三个不同的表 - 一个为你的产品,一个是你想卖他们在城市和一个用于描述每个产品都可以发送(id,product_id,city_id)。

从那里,只需使用简单的连接来选择所选城市的可能产品。

+0

查看@ RobinCastlin的完整查询答案。 – Shomz

相关问题