mysql - JOIN 语句的另一个子字符串中包含的字段的 SQL 子字符串
问题描述
我正在使用来自 NYC MTA旋转门数据和地铁站位置的两个数据集,一个包含在特定地铁站收集的旋转门数据,而另一个包含所述地铁站的经度和纬度。表之间没有公共键。我曾希望使用地铁站名称,但是在一张表中有许多不同的车站包含相同的名称,此外,表之间的命名约定略有不同。为了克服这个问题,我想使用地铁站名称和车站中存在的线路的组合来基于子字符串加入表格。
例如:
在火车站位置表中,一行包含
+------------------------+-----------------+
|Name |Line |
+------------------------+-----------------+
|Lexington Ave - 59th St | 4-5-6-6 Express |
+------------------------+-----------------+
而在火车站数据表中的一行可能看起来像这样
+---------+-----------------+
| Station | LineName |
+---------+-----------------+
| 59 ST | NQR456W |
+---------+-----------------+
LIKE
我能想到的最佳解决方法是使用关键字 OR函数进行某种搜索,LOCATE
以返回包含相同子字符串的单行行,这些行与站和行 ie 相同LIKE("%59%") AND NQR456
。我希望忽略 ST 和 AVE 之类的子字符串以及 '''-''' 之类的字符。
一旦我有了这些行,我想为每个可以发表JOIN
声明的站创建一个具有共享唯一 ID 的正确键的新列。
预先感谢您的所有帮助
我尝试了下面的查询,但是由于仅在另一个子字符串中搜索一个子字符串,它没有按预期工作
SELECT tsl.station, td.station, td.linename, tsl.line
FROM train_station_locations tsl, turnstile_data td
WHERE CONCAT('%',LOWER(tsl.station),'%')
LIKE CONCAT('%', REPLACE(REPLACE(td.station," st","")," ",""),'%')
AND CONCAT('%',LOWER(td.linename),'%') LIKE
REPLACE(CONCAT('%',LOWER(tsl.line),'%'),"-","");
我参考了以下问题
解决方案
处理没有PK的数据一定很沮丧……
根据您在上面共享的数据,似乎可以去除两个字段的非数字字符并寻找匹配项。59 = 59。
MySQL 8 支持 REGEXP_REPLACE: https ://dev.mysql.com/doc/refman/8.0/en/regexp.html#function_regexp-replace
在 MySQL 8 之前,您可以创建一个自定义函数: MySQL strip non-numeric characters to compare
推荐阅读
- python - 如何修复:Django 表单:{{ form }} 在 html 页面中不显示任何结果
- html - 我们如何使放置在链接标签内的 div 不被导航
- javascript - AngularJS - 从服务调用控制器变量的多重继承
- json - 如何在带有标记的颤动中使用 json_serializable 以在 GoogleMap 中使用它们?
- tcp - boost beast websocket服务器读取错误代码文件结束和操作取消
- python-3.x - 无法从图像中提取数字
- typo3 - Typ3 的 ke_search 扩展不显示字符长度小于 4 的单词
- javascript - 鼠标点击调用函数
- python - 在 PySpark Dataframes 中添加列需要时间
- postgresql - postgresql`在时区`不正确的行为?