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

时间:2014-09-30 13:48:36

标签: 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

所以使用like concat的问题是它没有选择特定值,但如果id为22,也选择2。

regexp的问题在于它只选择第一个ID,而不是通过列表。

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

1 个答案:

答案 0 :(得分:1)

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

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

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