数据库表中的逗号分隔列表,替代方案?
Posted
技术标签:
【中文标题】数据库表中的逗号分隔列表,替代方案?【英文标题】:Comma separated list in database table, alternative? 【发布时间】:2015-05-01 16:49:26 【问题描述】:我有一个数据库表,其中包含用于“游览地点”搜索的城镇。
城镇/城市字段以逗号分隔。当人们搜索布拉德福德等地方时,这会导致问题,因为它会为雅芳河畔布拉德福德带来结果(它只会显示一个结果,即它在表中看到的第一个匹配的记录)。
更新所有记录的最简单方法是什么,这样我就可以只为整个短语创建 SQL 搜索,例如“Bradford”或“Bradford on avon”,而不仅仅是列表中的一个词。
有些记录只有一个城镇。
我应该更新表格以用条替换逗号和空格吗?
【问题讨论】:
更改前端显示多个搜索结果肯定会更容易吗?这几乎是现在的常态...... 关键字是“规范化”,你的设计打破了第一范式。 【参考方案1】:最好的方法是将您的字段分成单独的列,以避免逗号分隔问题。任何其他方法都会让您感到头疼,工作量大于利润。任何其他查询都会更容易,性能也会更好。此外,它的结构将与数据库假定的语义保持一致。
有几种方法可以将 xls 或 csv 文件导入您的基础。无论我们谈论的是 phpMyAdmin、HeidiSQL、mysql Workbench,......过程都非常简单。如果您打算导入特定字段(例如日期),则只需小心。确保您的数据格式与目标字段类型一一致。如果您的来源有特殊字符[因为我是西班牙人;)这有时是我的情况]也许您可能希望在将生成的 .txt(例如)文件转换为 utf8 之前转换为纯文本,然后再进行导入。
希望能帮到你。
【讨论】:
谢谢,将尝试添加带有 id 和值的第二个表。【参考方案2】:根据需要更新字段以将其分成单独的行、列或表。将 CSV 数据存储在关系数据库中通常是一个坏主意 - 数据库可以轻松生成 CSV 数据(并且可能具有导入 CSV 数据的一些功能),但除非您将其存储为 BLOB(您不是) ,它应该在单独的列中。
例如,您可能会创建一个“CitiesVisited”表,其中包含用户记录的外键列。您可以将多个城市外键到同一个用户。
一个用户表:
UserID | UserName | OtherUserInfo
----------------------------------
1 Dan Some info
访问城市表:
CityVisitID | CityName | UserID
----------------------------------
1 Stratford 1
2 New Haven 1
3 London 2
然后,您可以轻松检查给定用户访问过的所有城市,即
SELECT cv.CityName
FROM CityVisited cv
INNER JOIN Users u
ON cv.UserID = u.UserID
WHERE u.UserName = 'Dan'
或者,如果您已经知道代码中的用户 ID...
SELECT cv.CityName
FROM CityVisited cv
WHERE cv.UserID = 1
【讨论】:
没有登录用户 - 该表是 3 列、id、邮政编码和逗号分隔的地点列表。我将尝试链接到 id 的第二个表选项。谢谢【参考方案3】:我想你有这样的标准:PlaceColumn Like LookFor & "*"
。试试这个:PlaceColumn = LookFor OR Placecolumn Like LookFor & ", *"
,你不需要更改你的数据。
【讨论】:
有些在行的开头,这会解释这个吗?谢谢。 请发布一些示例数据,现在我不清楚您需要实现什么。 Bovey Tracey, Dartmoor, Newton Abbot - 不过我想我会分开到另一张桌子上,我找到了这篇文章:sqljason.com/2010/05/converting-single-comma-separated-row.html以上是关于数据库表中的逗号分隔列表,替代方案?的主要内容,如果未能解决你的问题,请参考以下文章
如何使用第一个表中的逗号分隔值从另一个表中选择行? [复制]
MySQL - 如何选择表中的行,其中 id 值位于另一个表中的逗号分隔字段中?
如何把SQL数据表中一个字段的值按逗号分隔存入另外一个表,并删除重复记录?