我的BIRT有问题。我意识到我不能将301,90,96,121,139,367,291,296,298作为字符串传递给这个查询“SELECT dishes.name from dishes where dishes.id IN(?)”。但是我的数据库的结构是这样的,它必须使用以逗号命名的id。有没有办法解决这个问题?谢谢!
答案 0 :(得分:1)
解决方法是使用MySQL函数FIND_IN_SET():
SELECT dishes.name from dishes where FIND_IN_SET(dishes.id, ?)
但请注意,这会表现得非常糟糕。没有办法将搜索索引到以逗号分隔的值列表的中间。所以每次都必然会导致表扫描。
如果您需要在列表中搜索单个值,则更好的选择是avoid storing lists as comma-separated strings。
重新评论:
将其标准化为默认值。然后非规范化以优化特定查询。请注意,非规范化针对数据优化一个查询,但代价是其他查询。
例如,如果您有books <--> authors
,则可以通过将书籍的作者存储为书籍表格中以逗号分隔的列表来进行非规范化。这样可以快速查询书籍的所有作者,因为您可以避免加入。但是它查询给定作者的所有书籍的效率会降低。
因此,您必须知道哪些查询最有效,哪些查询可以降低效率。这完全取决于您的申请。
如果您需要所有查询同样有效,请将数据保持标准化格式。