我需要从列中找到一个特定的数字,比如我在表9
中查找具有列tours
的数字city
。列city
有一串数字,如
9
49
5,9
4,94
5,8,89,32
我需要在这些中找到数字9,所以我想要的唯一结果是
9
5,9
我尝试过使用REGEX,但无法正确使用。有人能指出我正确的方向吗?这是迄今为止的查询
SELECT
a.title, a.tourprice, a.city, b.city AS destCity
FROM
tours a
RIGHT JOIN
(SELECT
id, city
FROM
destinations
WHERE
id = 47) b ON a.city LIKE CONCAT('%,', b.city) OR a.city LIKE CONCAT(b.city, ',%') //b.city evaluates to 9
我意识到在我想要的数字之前或之后可能有或可能没有逗号。
答案 0 :(得分:2)
试试这个;)
SELECT
a.title,
a.tourprice,
a.city,
b.city AS destCity
FROM tours a
RIGHT JOIN (
SELECT id, city
FROM `destinations`
WHERE id = 47
) b ON FIND_IN_SET('9', a.city) > 0
如果a.city
并非全部用逗号,
分隔,我认为REGEXP
会更合适,就像@WiktorStribiżew给出的答案一样。
答案 1 :(得分:2)
我认为您错过了LIKE
的一种可能情况:如果9
出现在条目的中间中。所以,添加
OR a.city LIKE CONCAT('%,', b.city, ',%')
如果您想使用正则表达式,请尝试
WHERE a.city REGEXP CONCAT('[[:<:]]', b.city, '[[:>:]]')
其中[[:<:]]
是前导词,[[:>:]]
是尾随词边界。但是,在这种简单的情况下,你可以不使用REGEXP并使用LIKE
,因为MySQL中的REGEXP相当耗费资源。
答案 2 :(得分:1)
有一个MySQL内置函数,FIND_IN_SET
可以满足您的需求。
它返回第二个参数中第一个参数的从1开始的索引,其中第二个参数是逗号分隔的字符串。如果第二个参数根本不存在,则返回my_matrix = [[1 2 3 4 5 6]]?
。
0
由于MySQL将SELECT FIND_IN_SET(9, '9'); -- 1
SELECT FIND_IN_SET(9, '49'); -- 0
SELECT FIND_IN_SET(9, '5,9'); -- 2
SELECT FIND_IN_SET(9, '4,94'); -- 0
SELECT FIND_IN_SET(9, '5,8,89,32'); -- 0
SELECT FIND_IN_SET(9, '5,8,89,9,32'); -- 4
视为0
,将任何非FALSE
号视为0
,因此您可以在TRUE
子句或WHERE
中使用它{1}}。
JOIN
但有several reasons为什么存储像这样的逗号分隔列表是一个坏主意。对于旅游和城市的每个组合,您应该更喜欢一个单独的表格。