我有两个表,在一个字段中我需要在另一行中搜索一个值,该行是一个连接字符串。像这样:
表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
所以使用like concat
的问题是它没有选择特定值,但如果id为22,也选择2。
regexp
的问题在于它只选择第一个ID,而不是通过列表。
所以我正在寻找能够给我预期结果的查询。
答案 0 :(得分:1)
您有分隔符问题。您可以通过以下方式解决此问题:
SELECT *
FROM Table1 INNER JOIN
Table2
ON concat(', ', Table1.itemsid, ', ') LIKE CONCAT ('%, ', Table2.id, ', %')
WHERE Table1.name = 'Jorn';
但是,您应该使用联结表。在字符串中存储整数列表是个坏主意。 SQL有一个很好的存储列表构造。它被称为表,而不是字符串。