我有一个名为Test的表。其中我有3列。看起来像
imei的类型为int,V_Id的类型为int, app_no的类型为text 。
??
我想获得包含app_no = 25的行。 我使用了包含LIKE和IN的查询。 含义%25% ---但它也会给我记录app_no = 125和app_no = 254的位置。 我也试过" 喜欢app_id =' 25' "但它将排除记录,其中app_id = 14,25。
有没有其他方法可以获得我的欲望记录,其中包含app_id = 25的所有行,包括app_id = 14,25等记录。但不包括app_id = 254,125的记录。
答案 0 :(得分:4)
首先,您应该修复数据结构。在字符串中存储id列表是一个坏主意,原因有很多:
SQL'ish存储此类数据的方法在一个单独的表中,每imei_no
行一行,app_no
一行。这将是一个联结表。
有时,我们会遇到其他人非常糟糕的设计决策。在这种情况下,您可以使用find_in_set()
:
on find_in_set(25, app_no)
答案 1 :(得分:1)
请使用set in set
select * from <table_name> where FIND_IN_SET(app_no,'25')
答案 2 :(得分:1)
SELECT *
FROM test
WHERE FIND_IN_SET('25', app_no) > 0
我相信您也可以仅使用LIKE
运算符执行此操作。假设您的应用程序编号的CSV列表没有空格:
SELECT *
FROM test
WHERE app_no LIKE '25' OR
app_no LIKE '25,%' OR
app_no LIKE '%,25' OR
app_no LIKE '%,25,%'
答案 3 :(得分:0)
您还可以使用简单的REGIX:
SELECT
yourField,
youtField REGEXP('^25$|^25,|,25$')
FROM youtTable;
<强>样品强>
MariaDB [yourschema]> SELECT t,t REGEXP('^25$|^25,|,25$') FROM l;
+-------+----------------------------+
| t | t REGEXP('^25$|^25,|,25$') |
+-------+----------------------------+
| 1 | 0 |
| 2 | 0 |
| 1,25 | 1 |
| 1,125 | 0 |
| 125,1 | 0 |
| 25 | 1 |
| 25,0 | 1 |
+-------+----------------------------+
7 rows in set (0.00 sec)
MariaDB [yourschema]>