如何用多个可能的WHERE语句查询MySQL?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (318)

我正在尝试找到一个很好的解决方案,用java和mysql数据库构建的电影过滤系统。用户应该能够根据许多属性过滤他们希望看到的电影,例如:导演,演员,长度,流派,年份,......,。总共有11个字段可用于过滤查询。

问题是这些领域中的一些可以(并且可能会)留空。例如,用户可能只想基于某种类型,导演和长度来过滤数据。或者他们可能只想根据制作工作室过滤它,而不关心其他过滤器选项。

我已经建立了与服务器的连接,问题在于创建我将使用的“SQL_String” statement.executeQuery(SQL_String)

让我们说我只想过滤一个字段。然后我知道我可以写

String field = //user input (for example: actor)
String filter = //user input (for example: 'tom cruise')
String SQL_String = "SELECT * FROM Movies WHERE "+field + "=" +filter

但是,如果我想允许用户基于几个(或零)字段进行过滤,那么我不知道如何编写代码。

一些示例查询可能是:

"SELECT * FROM Movies WHERE (director = 'steven spielberg' AND genre = 'action' AND length >100)"

"SELECT * FROM Movies WHERE (type = 'tv-series' AND actor = 'bob odenkirk')"

因此,用户可以指定他们想要过滤哪些字段(如果有的话),我需要提出一个可以考虑这些字段并构造查询字符串的java代码。

提问于
用户回答回答于

蛮力是你可以根据你的用户过滤条件来判断具有多个if语句(或switch)的案例,然后创建一个string将有很多选择的案例。因为你有11个标准字段,所以会有大量的状态,所以这是不可能的。聪明的方法是创建一个string my_query类似的跟随

string my_query = "SELECT * FROM MOVIES WHERE (actor like '*', genre like '*' ...... )

该符号*在MySQL中就像一个通配符,它​​将根据需要引用任何字符或数字。所以此刻的查询,返回孔表。您可以做些什么来调整它,解析它并根据用户输入进行更改。如果用户想要按流派和年份进行提交,则您希望*用用户输入的流派替换第一个流派。这种方法将您降低到11个if语句,这是解决问题的可行方法,完成以这种方式操作字符串的任务。

用户回答回答于

这样试试:

import java.util.HashMap;
import java.util.Map;

public class MovieQueryTest {
  public static void main(String[] args) {

    String SQL_Query = "SELECT * FROM Movies WHERE ";

    HashMap<String, String> queryFilters = new HashMap<>();

    queryFilters.put("director", "Steven Spielberg");
    queryFilters.put("type", "tv-series");
    queryFilters.put("actor", "Bob Odenkirk");

    boolean firstQueryFilter = true;

    for (Map.Entry<String, String> entry : queryFilters.entrySet()) {
      if (firstQueryFilter) {
        SQL_Query += entry.getKey() + "=\'" + entry.getValue() + "\'";
        firstQueryFilter = false;
      } else {
        SQL_Query += " AND " + entry.getKey() + "=\'" + entry.getValue() + "\'";
      }

    }

    System.out.println(SQL_Query);

  }
}

扫码关注云+社区

领取腾讯云代金券