mysql - 像 concat 这样的 SQL 不会选择特定值

标签 mysql sql

我有两个表,在一个字段中我需要搜索另一行中的值,该行是一个连接字符串。像这样的事情:

表1:

|id|Name |Itemsid  |
|1 |John |1        |
|2 |Hans |4, 22, 23|
|3 |Chris|2, 4,    |
|4 |Jorn |4, 22, 23|
|5 |Claus|1, 4, 23 |
|6 |Marco|22, 4    |

表2:

|id |item       |
|1  |Mobile     |
|2  |Creditcard |
|3  |Wallet     |
|4  |Car        |
|22 |House      |
|23 |Boat       |

预期结果

4|Jorn|Car
4|Jorn|House
4|Jorn|Boat

我试过了

SELECT * 
FROM Table1 
INNER JOIN Table2 ON Table1.itemsid LIKE CONCAT ('%', Table2.id, '%') 
WHERE Table1.name = Jorn

结果

4|Jorn|Car
4|Jorn|Creditcard
4|Jorn|Wallet
4|Jorn|House
4|Jorn|Boat

因此我尝试了 regexp 因此内部联接将是:

SELECT * 
FROM Table1 
INNER JOIN Table2 ON Table1.itemsid REGEXP CONCAT ('(,|\s|^)', Table2.id, '(,|\s|$)') 
WHERE Table1.name = Jorn   

结果

4|Jorn|Car

因此,使用像 concat 的问题是,它不会选择特定值,但如果 id 为 22,也会选择 2。

regexp 的问题是它只选择第一个 id,而不遍历列表。

所以我正在寻找一个能给我预期结果的查询。

最佳答案

您遇到分隔符问题。您可以通过以下方式解决此问题:

SELECT * 
FROM Table1 INNER JOIN
     Table2
     ON concat(', ', Table1.itemsid, ', ') LIKE CONCAT ('%, ', Table2.id, ', %') 
WHERE Table1.name = 'Jorn';

但是,您确实应该使用联结表。在字符串中存储整数列表是一个坏主意。 SQL 有一个很好的存储列表的结构。它被称为表,而不是字符串。

关于mysql - 像 concat 这样的 SQL 不会选择特定值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26122529/

相关文章:

python - 连接RDS上的MySQL数据库

php - 处理$SESSION,存储在数据库表中,当用户清除浏览器数据时

mysql - 按表名显示组中所有 no 和 yes 的计数

mysql - 我需要合并两个数据库,其中保留一个数据库的表,但保留另一个数据库的数据

mysql - 字段大小会影响查询时间吗?

mysql - 创建索引以提高mysql连接性能的困惑

mysql - App Engine - Google Cloud SQL - jUnit 的本地 MySQL 数据库 - 未找到 rdbms 包

php - 从多个表中选择,其中 php 变量等于列值

mysql - 选择已售出和未售出的产品

MySQL 存储过程 SELECT var INSERT 后值错误