如何在coumn\u name有逗号分隔值的地方运行sql查询?

wsxa1bj1  于 2021-06-21  发布在  Mysql
关注(0)|答案(3)|浏览(246)
CustomerID  cat_id  ContactName  Address    City    PostalCode  Country
1   Alfreds 13      Maria Anders Obere Str  Berlin  12209   Germany
4   Around  13,14   Thomas Hardy 120 Hanov  London  WA1 1DP UK

获取14个数据的查询是什么?我试过了

SELECT * 
FROM `customers` 
WHERE cat_id IN (13,14)

但失败了。

7d7tgy0s

7d7tgy0s1#

修正你的数据模型!为什么错了?
数值应存储在类型正确的列中,而不是字符串。
这些看起来像身份证。应该正确定义外键关系。
sql的字符串处理能力很差。
使用字符串操作的查询通常无法进行优化,从而优化索引、表统计信息和分区的使用。
sql有非常好的数据结构来存储列表。它叫table。
所以,你应该有一张每行一行的table customer_id 以及 cat_id . 这通常称为“连接表”或“关联表”。
也就是说,有时我们会被其他人的设计决策所困扰,真的,真的,真的很糟糕。如果是这样,你可以使用 find_in_set() :

where find_in_set(13, cat_ids) > 0 and  -- or is that "or"
      find_in_set(14, cat_ids) > 0
xfb7svmp

xfb7svmp2#

这样的方法应该有用:

SELECT * FROM $tbls WHERE CONCAT(',',cat_id,',') LIKE '%,14,%';

尽管你应该考虑让它正常化。

mzmfm0qo

mzmfm0qo3#

你可以用 FIND_IN_SET :

SELECT * 
FROM `customers` 
WHERE FIND_IN_SET(13, `cat_id`) > 0 OR FIND_IN_SET(14, `cat_id`) > 0

注意:您不应该这样存储值!
您的表应该如下所示,以避免使用 FIND_IN_SET :
customers :

CustomerID | ContactName  | Address   | City   | PostalCode | Country
         1 | Maria Anders | Obere Str | Berlin | 12209      | Germany
         4 | Thomas Hardy | 120 Hanov | London | WA1 1DP    | UK

customers_cats :

customer_id | cat_id
          1 | 13
          4 | 13
          4 | 14

cats :

CatID | Column1
---------------
   13 | abc
   14 | def

因此,查询如下所示:

SELECT c.* 
FROM `customers` c LEFT JOIN `customers_cats` cc ON c.CustomerID = cc.customer_id 
WHERE cc.cat_id IN (13, 14)

相关问题