(оператор SQL, указанный ниже, предназначен для SQLite)
- Таким образом, для второго вам потребуется 10 лучших рецептов, соответствующих большинству ингредиентов
Вам нужно:
- подсчитать строку, соответствующую вашему списку ингредиентов (используйте оператор IN)
- упорядочить результат по наилучшему количеству в порядке убывания (4,3,2, ...)
- ограничить результат 10
Таким образом, выражение sql выглядит как
SELECT
r.RecipeId, COUNT(1) cnt, r.Name, r.Recipe, r.Origin, r.Category, r.Favoured
FROM
RecipeDB r
INNER JOIN IngredientDB i USING(RecipeID)
WHERE
i.Ingredient in ('ingr_1',..,'ingr_x')
GROUP BY 1
ORDER BY 2 DESC
LIMIT 10
с использованием AIR
+ AS3
itможет быть что-то вроде этого:
var sqls:SQLStatement = new SQLStatement()
sqls.sqlConnection = YOUR SQL CONNECTION
// your ingredient list
var ingredients:Array = ['i2', 'i3', 'i4']
// use to build the in parameter array
var inParams:Array = []
// fill parameter values
for(var i:int = 0; i < ingredients.length; ++i) {
inParams[i] = '?'
sqls.parameters[i] = ingredients[i]
}
// build the query
var qry:String = "SELECT r.RecipeId, COUNT(1) cnt, r.Name, r.Recipe, r.Origin,"+
"r.Category, r.Favoured FROM RecipeDB r INNER JOIN IngredientDB i USING(RecipeID)"+
"WHERE i.Ingredient in (" + inParams.join(',') + ") GROUP BY 1 "+
"ORDER BY 2 DESC LIMIT 10"
// set the query
sqls.text = qry
//execute
sqls.execute()
- И для первой же идеи, как указано выше, но вам нужно также подсчитать все ингредиенты, присутствующие в рецепте, чтобы обеспечить соотношение между соответствием /всего
Вам нужно:
- подсчитать строку, соответствующую вашему списку ингредиентов (используйте оператор IN)
- сделать ранг делением предыдущего подсчетапо всему суммарному ингредиенту
- получите наилучшее совпадение
- ограничьте результат 1
Итак, статистика sqlЭлемент выглядит так:
SELECT
i1.RecipeId, (cast(rs.cnt as real) / cast (COUNT(1) as real)) rank,
rs.Name, rs.Recipe, rs.Origin, rs.Category, rs.Favoured
FROM
IngredientDB i1
INNER JOIN (
SELECT
r.RecipeId, COUNT(1) cnt, r.Name, r.Recipe, r.Origin, r.Category, r.Favoured
FROM
RecipeDB r
INNER JOIN IngredientDB i USING(RecipeID)
WHERE
i.Ingredient in ('ingr_1',..,'ingr_x')
GROUP BY 1
) rs USING (RecipeId)
GROUP BY 1
ORDER BY 2 DESC
LIMIT 1
Используя ту же логику, что и в первом примере, ваш запрос может быть записан как:
var ingredients:Array = ['i2', 'i3', 'i4']
var inParams:Array = []
for(var i:int = 0; i < ingredients.length; ++i) {
inParams[i] = '?'
sqls.parameters[i] = ingredients[i]
}
var qry:String = "SELECT i1.RecipeId, (cast(rs.cnt as real) / cast (COUNT(1) as real)) rank,"+
"rs.Name, rs.Recipe, rs.Origin, rs.Category, rs.Favoured "+
"FROM IngredientDB i1 INNER JOIN ("+
"SELECT r.RecipeId, COUNT(1) cnt, r.Name, r.Recipe, r.Origin, r.Category, r.Favoured "+
"FROM RecipeDB r INNER JOIN IngredientDB i USING(RecipeID) "+
"WHERE i.Ingredient in (" + inParams.join(',') + ") GROUP BY 1) rs USING (RecipeId) "+
"GROUP BY 1 ORDER BY 2 DESC LIMIT 1"