数据库表中的逗号分隔列表,替代方案?

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数据表中一个字段的值按逗号分隔存入另外一个表,并删除重复记录?

Oracle PL/SQL 程序在源表中拆分逗号分隔的数据并推送到目标表中

从其他表中为每个用逗号分隔的 id 选择多个数据

从表中获取逗号分隔的一组值,其中另一个表上的另一个参考值出现两次(或更多)