我有两个表,在一个字段中我需要搜索另一行中的值,该行是一个连接字符串。像这样的事情:
表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/