我正在搜索welds
。welder_id
和welds
。bal_welder_id
,这些是由用户以空格分隔的唯一焊工ID列表。
记录集看起来像99
,199
,99 w259
,w259 259 5-a
99,199,259,5-a和w259是唯一的焊工识别码
我不能单独使用MYSQL INSTR()函数来搜索" 99"将使用" 199"
提取记录每个项目的用户通常以不同的方式(000,a000,0aa)格式化他们的焊工ID,以匹配他们客户的记录。
出于多种原因,我真的想避免使用PHP代码。
使用" w259"选择记录在welder_id
列中bal_welder_id
或SELECT * FROM `welds`
WHERE `omit`=0
AND( (`welder_id`='w259' OR `bal_welder_id`='w259')
OR (`welder_id` LIKE 'w259 %' OR `bal_welder_id` LIKE 'w259 %')
OR (`welder_id` LIKE '% w259' OR `bal_welder_id` LIKE '% w259')
OR (INSTR(`welder_id`, ' w259 ') > 0 OR INSTR(`bal_welder_id`,' w259 ') > 0))
ORDER BY `date_welded` DESC
LIMIT 100;
列中,我的查询如下所示。
$rentingsquery = "SELECT * FROM TBL_rentings
JOIN TBL_rentings ON TBL_properties.propertyId = TBL_rentings.propertyId
JOIN TBL_people ON TBL_rentings.personId = TBL_people.personId
WHERE personId='$personId'";
$rentingsResult=mysql_query($rentingsquery) or die ("Query to get data from TBL_properties failed: ".mysql_error());
它可以工作,但在我的工作站的SSD上有1300条测试记录需要0.0030秒。
一年或两年后,实际的数据库将有数十万。
有更好的方法吗?
感谢。
答案 0 :(得分:0)
如果我正确理解你的问题,一个选项是使用FIND_IN_SET(str, strlist)字符串函数,它返回逗号分隔字符串列表str
中字符串strlist
的位置,例如:
SELECT FIND_IN_SET('b','a,b,c,d');
将返回2.由于您的字符串不是用逗号分隔,而是用空格分隔,您可以使用REPLACE()用逗号替换空格。您的查询可以是这样的:
SELECT * FROM `welds`
WHERE
`omit`=0
AND
(FIND_IN_SET('w259', REPLACE(welder_id, ' ', ','))>0
OR
FIND_IN_SET('w259', REPLACE(bal_welder_id, ' ', ','))>0)
然而,优化器不能太多,因为FIND_IN_SET不能使用索引(如果存在)。如果可能的话,我建议你将你的桌子标准化。