Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQLiteDatabase选择具有动态数量的条件_Sql_Sqlite_Select_Join - Fatal编程技术网

SQLiteDatabase选择具有动态数量的条件

SQLiteDatabase选择具有动态数量的条件,sql,sqlite,select,join,Sql,Sqlite,Select,Join,我是数据库新手,所以这可能很简单。 我有以下数据库结构: 桌上产品 表过滤器(可能包含类似的内容) 蓝色 黑色 红色 小号 品牌X 表关系(只有产品id和筛选器id) 假设我想获得所有黑色或红色的小产品,我编写了以下查询: SELECT products.name FROM products JOIN pfrelation ON ((pfrelation.filter_id=18) AND (pfrelation.filter_id=11 OR pfrelation.filter_

我是数据库新手,所以这可能很简单。 我有以下数据库结构: 桌上产品

表过滤器(可能包含类似的内容)

  • 蓝色
  • 黑色
  • 红色
  • 小号
  • 品牌X
表关系(只有产品id和筛选器id)

假设我想获得所有黑色或红色的小产品,我编写了以下查询:

SELECT products.name FROM products 
JOIN pfrelation ON
    ((pfrelation.filter_id=18) AND (pfrelation.filter_id=11 OR pfrelation.filter_id=13) AND products.id=pfrelation.product_id) 
在上面的示例中,11和13表示黑色和红色,而18表示小的id。因为您可能怀疑上述查询没有结果(id不能同时为18和11/13)。如何编写select以动态添加任何过滤器组合?如何重写上面示例中的查询


谢谢

您可以通过动态查询来实现这一点。 我对PostgreSql不太了解,但我了解SQL Server,所以我举了一个例子来说明这一点


我通过以下方式动态构建查询:

public ArrayList<Products> getFilteredOnlinePictures( Hashtable<String, List<String>> filters,..)
{
    SQLiteDatabase db = getWritableDatabase();
    // create query conditions
    StringBuffer filtersQuery = new StringBuffer();
    for (String key: Collections.list(filters.keys()))
    {
        List<String> filtersValues = filters.get(key);
        if (filtersQuery.length() > 0)
            filtersQuery.append(" INTERSECT ");
        filtersQuery.append("SELECT " + TABLE_PFRELATIONS + "." + COLUMN_PRODUCT_ID
            + " FROM " + TABLE_PFRELATIONS + " WHERE " + TABLE_PFRELATIONS + "."
            + COLUMN_FILTER_ID + " IN (");
        for (String value: filtersValues)
        {
            long filterID = getIDForFilter(db, key, value);
            filtersQuery.append(filterID);
            if (filtersValues.indexOf(value) == (filtersValues.size() - 1))
            {
                // this is the last value
                filtersQuery.append(")");
            }
            else
            {
                // there are more values
                filtersQuery.append(",");
            }

        }
    }
    if (filtersQuery.length() > 0)
    {
        filtersQuery.append(")");
        filtersQuery.insert(0, " WHERE " + TABLE_PRODUCTS + ".id" + " IN (");
    }
    String sql = "SELECT " + TABLE_PRODUCTS + "." + COLUMN_NAME + " FROM " + TABLE_PRODUCTS + filtersQuery.toString();
    Cursor c = db.rawQuery(sql, null); ...

通过这种方式,我可以使用任意数量的值进行任何筛选。

谢谢,同时我自己也做了类似的事情(我写了下面的内容以供进一步参考),但我会接受您的回答:)
public ArrayList<Products> getFilteredOnlinePictures( Hashtable<String, List<String>> filters,..)
{
    SQLiteDatabase db = getWritableDatabase();
    // create query conditions
    StringBuffer filtersQuery = new StringBuffer();
    for (String key: Collections.list(filters.keys()))
    {
        List<String> filtersValues = filters.get(key);
        if (filtersQuery.length() > 0)
            filtersQuery.append(" INTERSECT ");
        filtersQuery.append("SELECT " + TABLE_PFRELATIONS + "." + COLUMN_PRODUCT_ID
            + " FROM " + TABLE_PFRELATIONS + " WHERE " + TABLE_PFRELATIONS + "."
            + COLUMN_FILTER_ID + " IN (");
        for (String value: filtersValues)
        {
            long filterID = getIDForFilter(db, key, value);
            filtersQuery.append(filterID);
            if (filtersValues.indexOf(value) == (filtersValues.size() - 1))
            {
                // this is the last value
                filtersQuery.append(")");
            }
            else
            {
                // there are more values
                filtersQuery.append(",");
            }

        }
    }
    if (filtersQuery.length() > 0)
    {
        filtersQuery.append(")");
        filtersQuery.insert(0, " WHERE " + TABLE_PRODUCTS + ".id" + " IN (");
    }
    String sql = "SELECT " + TABLE_PRODUCTS + "." + COLUMN_NAME + " FROM " + TABLE_PRODUCTS + filtersQuery.toString();
    Cursor c = db.rawQuery(sql, null); ...
SELECT products.name FROM products
WHERE products.id IN (
    SELECT pfrelation.product_id FROM pfrelation WHERE pfrelation.filter_id IN (18) 
    INTERSECT 
    SELECT pfrelation.product_id FROM pfrelation WHERE pfrelation.filter_id IN (11,13)
    )