【问题标题】:MySQL where condition when intersecting 2 values (comma delimited)MySQL where条件相交2个值(逗号分隔)
【发布时间】:2013-12-21 22:57:22
【问题描述】:

我有这样的表:

    id  products  
------  ----------
     5  1,2,3     
     6  2,4,5     
     9  1,4,7     
    17  4,6,7     
    18  1,6,8     
    19  2,3,6     

我必须只选择那些行,该行的products 列包含(2,3) 值之一。

在这种情况下查询必须返回:

    id  products  
------  ----------
     5  1,2,3     
     6  2,4,5            
    19  2,3,6     

但我不明白如何构造这个查询。

有什么想法吗?

提前致谢。

【问题讨论】:

  • 我需要选择是否至少有一个mutch。

标签: mysql sql database select


【解决方案1】:
SELECT id,products
FROM yourTable
WHERE FIND_IN_SET('2',products)>0
   OR FIND_IN_SET('3',products)>0

sqlFiddle

【讨论】:

  • 好的,这很好用。我将使用PHP 生成查询,并为所有键值添加FIND_IN_SET 条件。谢谢!
  • 你可以把WHERE 0然后在PHP里面生成一堆OR FIND_IN_SET(...
【解决方案2】:

你介意试试这个吗?

select * from TABLE_NAME where products regexp "(^|,)[23](,|$)";

它在开始时或结束时执行两个或三个。或者在逗号之间。

【讨论】:

  • 这是个好主意,但如果我不输出那一列的值为“23、24、25”的行,它将无法正常工作。是吗?
  • (^|,)((23)|(24)|(25))(,|$)
  • 但它会返回产品的 id 也有以下值 235,2456
【解决方案3】:

从不,从不,从不在一列中存储多个值。

就像你现在看到的那样,这只会让你头疼。规范化您的表格。然后就可以正常选择了。

你的表格应该是这样的

id  product
--  -------
 5  1   
 5  2   
 5  3      
 6  2
 6  4
 6  5
 ...

使用该表结构,您的选择将是

select id
from your_normalized_table
where product in (2,3)
group by id
having count(distinct product) = 2

该查询可以利用索引,而且速度非常快。

【讨论】:

  • 我明白了你所说的,但在这种情况下,我有多个具有相同 id 的记录。在这个表中,我应该有所有具有唯一 ids 的行。
  • 这听起来像使用 另一个 表更好。它被称为N 到M 关系。示例表:customersproducts 和一个新的映射表product_orders
  • 是的,在这种情况下,我猜 N 到 N 的关系将是最好的解决方案。 (男性数据库性能)
猜你喜欢
  • 1970-01-01
  • 2023-02-03
  • 2014-10-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多