如何将用户可自定义的高级搜索转换为SQL查询?

时间:2012-02-07 05:11:20

标签: php mysql codeigniter search nested

我意识到这是相当抽象的,但我想做一些与Remember The Milk的智能列表不同的事情: 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查询字符串友好等等。
  4. 更糟糕的是,在where子句中可以很好地处理简单的OR条件,但是AND(复合条件)似乎需要在每个条件下进行额外的连接,而我却失去了如何在可持续代码中组织它。 / p>

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

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

1 个答案:

答案 0 :(得分:2)

抽象问题值得抽象回答。 :-)唉,我将举例说明另一个软件如何处理这个问题,因为我不是很哲学。

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

我无法找到搜索页面的任何屏幕截图,因此您可能希望查看RT的online demo。登录,然后从窗口左上角的菜单中选择" Ticket"然后"新搜索"。

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

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

我不知道如何加入其他表格。我回答这个问题,好像它是一个UI / UX问题,而不是数据建模问题。 : - )