我对 BIRT 有疑问。我意识到我不能将 301,90,96,121,139,367,291,296,298 作为字符串传递到此查询“从菜肴中的菜肴中选择菜肴名称。”。但是我的数据库的结构必须使用逗号命名的 id。有没有办法解决这个问题?谢谢!
问问题
228 次
1 回答
1
解决方法是使用 MySQL 函数FIND_IN_SET():
SELECT dishes.name from dishes where FIND_IN_SET(dishes.id, ?)
但请注意,这将非常糟糕。无法将搜索索引到以逗号分隔的值列表的中间。所以这必然会导致每次都进行表扫描。
如果您需要在列表中搜索单个值,更好的选择是避免将列表存储为逗号分隔的字符串。
回复您的评论:
标准化为默认值。然后进行非规范化以优化特定查询。请注意,非规范化优化了针对数据的一个查询,但以牺牲其他查询为代价。
例如,如果您有books <--> authors
,您可以通过将一本书的作者作为逗号分隔的列表存储在 books 表中来进行非规范化。这样可以快速查询一本书的所有作者,因为您避免了连接。但这会降低查询给定作者的所有书籍的效率。
因此,您必须知道哪些查询需要最高效,哪些查询可以降低效率。这完全取决于您的应用程序。
如果您需要所有查询都同样有效,请将数据保持为规范化形式。
于 2013-03-22T15:41:21.577 回答