使用可选参数/排名构造SQL查询

时间:2010-08-13 18:58:19

标签: php sql mysql

我想知道使用mysql完成以下操作的好方法是什么:

假设我有一个包含这些字段的表:

MyTable
---------
Country [string]
Region/Province/State [string]
City [string]

我在数据库中有以下数据行

Entry 1: Canada, Ontario, Toronto
Entry 2: Canada, Ontario, Hamilton
Entry 3: Canada, Alberta, Calgary

现在我希望能够根据用户提供的信息搜索该表。但是,如果找不到用户提供的信息的结果,我希望程序尝试使其不那么具体。例如,如果用户提供:

Canada, Ontario, Kingston

我希望搜索查询搜索所有3个字段(这将产生0行),然后仅搜索国家/地区(将产生2行),然后仅搜索国家(仅产生1行)在前两个之上的额外行)。这是可能的,如果是的话,它会相当有效吗?这可以通过1个查询完成,还是需要多个查询,然后进行一些交叉引用以消除相同的行(我想这样效率不高)?

非常感谢!

修改 通过交叉引用/多个查询,我正在考虑使用UNION进行多次选择。但我想知道是否有更好/更合理的方法来做到这一点。

2 个答案:

答案 0 :(得分:1)

我会使用3个查询。

对表进行规范化,以便您可以检查countryregion/province/statecity的小表,然后将它们链接到1 - >上的实际条目。 N(一对多关系)。

SELECT * FROM cities
LEFT JOIN actual_locations ON actual_locations.city = cities.id 
WHERE cities = 'NYC'

希望它有所帮助!

答案 1 :(得分:0)

您可以创建一个查询,选择与三种可能性中的任何一种匹配的行(匹配国家,地区和城市,匹配国家和地区,匹配国家/地区)。在该查询中,您可以使用IF语句根据该值分配值和排名。

运行查询以查看记录是否与所有三个输入匹配更简单。如果它不返回任何行,则运行查询以匹配两个。如果那个没有返回任何行,则只匹配Country输入。