【问题标题】:How would I translate user-customizable advanced searches to SQL queries?如何将用户可自定义的高级搜索转换为 SQL 查询?
【发布时间】:2012-02-28 14:07:13
【问题描述】:

我意识到这是相当抽象的,但我想做一些与“记住牛奶”的智能列表不同的事情: http://www.rememberthemilk.com/help/answers/search/advanced.rtm

我有一组经过标记、分类等的用户故事,我发现让用户可自定义的“视图”或“智能列表”返回一组特定的故事。这使得使用该应用程序的工作流程非常灵活且适用于许多不可预见的场景。

我现在对简单的 OR 查询没有任何问题:

WHERE tag = "tag1" OR tag = "tag2" OR category = "category1" OR category = "category2"

但这确实不如混合 AND/OR 条件有用:

WHERE (tag = "tag1" OR tag = "tag2") AND category = "category1"

因此,明显的问题是:

  1. 嵌套条件
  2. 在同一查询中混合使用 AND/OR 条件
  3. 使这种“查询抽象”语法或多或少具有人类可读性、易于存储/解析、URL 查询字符串友好等。

更糟糕的是,可以在 where 子句中很好地处理简单的 OR 条件,但 AND(复合条件)似乎需要每个条件的额外连接,我不知道如何在可持续代码中组织它。

我正在使用 PHP/MySQL,但这似乎不是特定于平台的。

总而言之,我想找到一种可持续的方法来解析人为生成的条件序列并将其转换为 SQL。

【问题讨论】:

  • 您在寻找什么样的答案?现有技术的例子?伪代码(它的桶)?关于您正在实施某些解决方案的编程问题的建议?或者只是同意这个问题很棘手? (作为参考,这个问题很棘手。)
  • 如何将语法字符串解析为顺序数据库操作,是否处理过滤客户端/服务器端,是否为每个保存的搜索创建自定义数据库视图。只是希望人们在这一点上抛出想法。

标签: php mysql codeigniter search nested


【解决方案1】:

一个抽象的问题值得一个抽象的答案。 :-) 唉,我要给你一个例子,说明另一个软件是如何处理这个问题的,因为我不是很哲学。

Request Tracker 是一个历史悠久的浏览器 UI 故障单系统。它有一个非常强大的工单搜索机制,知道如何读取与工单相关的每个可能的字段,并让您可以通过 Web 界面有效地制作整个 SQL 查询。

我找不到任何搜索页面的屏幕截图,所以也许你可能想看看 RT 的online demo。登录,然后从窗口左上角的菜单中选择“票证”,然后选择“新搜索”。

或者更好的是,要查看如何在此搜索工具上构建所有搜索,请单击主演示屏幕右侧列表中的队列(登录后立即显示)。当您显示一组门票时,请单击窗口顶部的“门票”。 (不是出现的菜单选项。只需点击门票。)

此处的查询构建器在右侧显示查询的结构,并允许您使用左侧的控件混合匹配要包含在其中的内容。如果您是“高级”用户并且想要手动编写自己的查询,或者清理 Web UI 遇到的问题,您可以单击顶部的“高级”链接并编辑看起来非常像 SQL 的内容。

我不会讨论如何将其他表加入其中。我会回答这个问题,就好像这是一个 UI/UX 问题,而不是数据建模问题。 :-)

【讨论】:

  • Ghoti...“鱼”是什么?呵呵。 UI/UX 方面非常重要,非常感谢您提供了一个先例。我想做的最后一件事就是重新发明轮子。你是对的——问题不在于数据建模本身,而是过滤器是应用在服务器端还是客户端完全在我的问题范围内。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多