列出db元素

时间:2016-05-29 18:08:20

标签: java mysql

我从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

有人可以帮助我吗?

1 个答案:

答案 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。但是,由于多种原因,我会尽量避免这种情况:

  • 数据库优化器实际上无法为您提供帮助,因此您需要优于优化器&#34; - 我怀疑像PHP这样的基于解释器的语言可以。
  • 您需要从DB检索所有配方(可能会成为一个巨大的表)到PHP。因此,您的计算通过多个堆栈传输,需要验证数据类型等等。简而言之,您的处理过程越来越远了#34;从数据来看 - 众所周知,这种结构比较慢。
  • 编码要读得更糟,因此维护起来更糟糕。 SQL语句可能不是太简单,也不是更抽象,但通过其描述性质,您的意图可以更紧凑的方式显示。

(注意:很少有案例,更多的抽象提供更好的性能 - 通常,混合这两个架构概念并不能很好地解决这个问题。)