我从db获取一些数据。因为第一个表中找到的所有数据都与第二个表中的数据进行比较。所以我检索存储在一个表中的成分,并将这些成分与存储在第二个表中的用户喜欢的成分进行比较。 如果有与最喜欢的成分相同的成分,我想要包含成分的每一行。
现在我从db中检索所有数据,并对所有成分进行比较,而不是对每个成分进行比较。
这是我的代码:
Statement st1 = con.createStatement();
rs1 = st1.executeQuery("Select Nume from ingredientplacut where Id_user = '24'");
while( rs1.next())
{
String nrRet1 = rs1.getString("Nume");
secondList.add(nrRet1);
}
System.out.println(secondList);
Statement st = con.createStatement();
java.sql.PreparedStatement ps=con.prepareStatement("SELECT ID_reteta,Nume,Descriere,Ingrediente,Mod_preparare,Dificultate,Tip,Imagini,Total_grasimi,Total_carbohidrati,Total_proteine,Total_calorii FROM reteta");
rs=ps.executeQuery();
while( rs.next()){
String nrRet = rs.getString("Ingrediente");
firstList.add(nrRet);
System.out.println("----");
}
ArrayList<String> al3= new ArrayList<String>();
for (String temp : firstList)
{
boolean isTrue=false;
for(String temp2:secondList)
{
if(temp.contains(temp2))
{
isTrue=true;
break;
}
}
if(isTrue)
al3.add("YES");
else
al3.add("NO");
}
System.out.println(al3);
System.out.println(firstList);
ArrayList<Integer> al4= new ArrayList<Integer>();
for (String temp2 : secondList) {
boolean isTrue = false;
for (String temp : firstList) {
if (temp.contains(temp2)) {
isTrue = true;
break;
}
}
if (isTrue)
al4.add(1);
else
al4.add(0);
}
System.out.println(al4);
输出是:
[afine, almette, alune, albus de ou de gaina, andive, mere]
----
----
[YES, YES, NO, NO, NO, NO, NO, NO, YES]
[200 grame fusilli cu legume (afine,alune);
200 grame smantana 12%;
50 grame iaurt;
50 grame cascaval afumat ;
1/2 lingurite mustar;
doi catei de usturoi sau o lingurita de usturoi deshidratat;
mere;
patrunjel;
piper;
sare., 250 grame dovleac ras;
170 grame fulgi fini de ovaz;
150 ml lapte dulce;
80 grame stafide;
un ou;
doua linguri faina integrala;
40 grame miere;
un plic de zahar vanilat;
½ lingurita scortisoara;
afine;
putina sare., 4 medalioane de somon proaspat (aproximativ 800 grame);
un ardei rosu mare;
o lamaie mica;
o rosie medie;
putin patrunjel;
4-5 catei de usturoi;
doua lingurite capere;
2-3 linguri ulei de masline;
piper;
boia dulc;
sare., 150 grame maioneza de casa;
300 grame telina (net);
300 grame piept sau pulpe dezosate;
1/3 capatani usturoi;
marar si patrunjel dupa gust;
aprox 1/2 borcan castraveti murati in otet;
o lingura boia dulce;
½ lingurite piper;
10-20 ml ulei masline.
[1, 0, 1, 0, 0, 1]
我希望输出为:
[200 grame fusilli cu legume (afine,alune);
200 grame smantana 12%;
50 grame iaurt;
50 grame cascaval afumat ;
1/2 lingurite mustar;
doi catei de usturoi sau o lingurita de usturoi deshidratat;
mere;
patrunjel;
piper;
sare.
[1, 0, 1, 0, 0, 1] //3 ingredients related
250 grame dovleac ras;
170 grame fulgi fini de ovaz;
150 ml lapte dulce;
80 grame stafide;
un ou;
doua linguri faina integrala;
40 grame miere;
un plic de zahar vanilat;
½ lingurita scortisoara;
afine;
putina sare.,
[0, 0, 0, 1, 0, 0] //one ingredient related
4 medalioane de somon proaspat (aproximativ 800 grame);
un ardei rosu mare;
o lamaie mica;
o rosie medie;
putin patrunjel;
4-5 catei de usturoi;
doua lingurite capere;
2-3 linguri ulei de masline;
piper;
boia dulc;
sare.
[0, 0, 0, 0, 0, 0] //0 Ingredients related
150 grame maioneza de casa;
300 grame telina (net);
300 grame piept sau pulpe dezosate;
1/3 capatani usturoi;
marar si patrunjel dupa gust;
aprox 1/2 borcan castraveti murati in otet;
o lingura boia dulce;
½ lingurite piper;
10-20 ml ulei masline.
[0, 0, 0, 0, 0, 0] //0 Ingredients related
有人可以帮助我吗?
答案 0 :(得分:0)
我不是百分百肯定,如果我完全正确地完成所有方面,我的罗马尼亚语也非常糟糕,但这就是我得到的:
我们有一个叫ingredientplacut
的表,显然列出了用户喜欢的所有成分。我们可以假设
name
中,user_id
的属性ingredientplacut
提供了用户的标识符,因此是此表中主键的一部分。表reteta
显然提供了给定配方的成分并且似乎是非规范化的(@Bogdan:如果这还不是另一个数据库表的视图,请检查您的关系数据模型。否则,你很有可能遇到删除和更新异常现象)。其中的成分名称存储在属性Ingrediente
中。
如果配方成分是最喜欢的成分,那么可以很容易地检查配方的成分列表。通过发出以下联接:
SELECT r.ID_reteta, r.Ingrediente, fav.name IS NOT NULL as isFavorite
FROM retata as r
LEFT JOIN inredientplacut as fav ON r.Ingrediente = fav.name
WHERE fav.user_id = '24'
鉴于此声明,使用&#34;最受欢迎的&#34;也可以轻松确定食谱。成分:
SELECT ID_retata, count(*) as favoriteIngredients
FROM (
SELECT r.ID_reteta, r.Ingrediente, fav.name IS NOT NULL as isFavorite
FROM retata as r
LEFT JOIN inredientplacut as fav ON r.Ingrediente = fav.name
WHERE fav.user_id = '24'
) as favlist
WHERE favlist.isFavorite = true
ORDER BY favoriteIngredients DESC
GROUP BY ID_retata
但是请注意,这是一个非常糟糕的性能指标,因为没有考虑成分的重量(我可能喜欢胡椒和洋葱,但这并不意味着我喜欢所有的菜肴他们是......)
当然,您也可以通过SQL只读取源表,在PHP级别上实现这样的LEFT JOIN
。但是,由于多种原因,我会尽量避免这种情况:
(注意:很少有案例,更多的抽象提供更好的性能 - 通常,混合这两个架构概念并不能很好地解决这个问题。)