如何从一列中选择不同的类别数据?

Posted

技术标签:

【中文标题】如何从一列中选择不同的类别数据?【英文标题】:How to select different category data from in one colum? 【发布时间】:2015-12-04 19:43:56 【问题描述】:

我的数据库中有一个名为product 的表,列有namepricecategory,有6 个项目与2 个主要类别相关。比方说:

+----------+-------+-----------+
|  name    | price |  category |
+----------+-------+-----------+
|  mango   |  $58  |  fruits   |
|  avocado |  $74  |  fruits   |
|  apple   |  $20  |  fruits   |
|  carrot  |  $35  | vegetable |
|  onions  |  $40  | vegetable |
+----------+-------+-----------+

我想做2个JComboBox,先选择一个类别,再选择一个JComboBox来加载所有相关的名称(如果我选择fruit,那么其他JComboBox会显示所有的水果项目)。

这是我的代码,它从数据库中选择所有 name 并将其加载到组合框。

  ArrayList<String> list = new ArrayList<String>();

        try 
            DBconnector db =  new DBconnector();
            con=  db.connect();
            String qr = "SELECT name FROM product";
            PreparedStatement stm = con.prepareStatement(qr);
            ResultSet rs = stm.executeQuery(qr);

            while(rs.next())
                String name = rs.getString("name");
                //add group list to the arraylist
                list.add(name);
            
            rs.close();

            //Populate the comboBox
            if(!list.isEmpty())
            DefaultComboBoxModel model = new DefaultComboBoxModel(list.toArray());
            combItems.setModel(model);
            else
                System.out.println("List is empty...");
            
         catch (SQLException ex) 
            System.out.println("Data not retrieved");
            ex.printStackTrace();

        
        return list;

有人可以帮帮我吗?

【问题讨论】:

select name from product where category = ???您可能想将问题缩小到您遇到问题的部分。使用组合框;编写查询;别的东西…… 【参考方案1】:

您有 2 个主要选项:在用户选择类别后,使用所选类别运行带有 where 子句的查询;或创建一个从类别到名称列表的映射,然后使用它来创建您的第二个组合框。

第二个选项看起来像:

Map<String, List<String>> categoryMap = new HashMap<>();
while(rs.next())
    List<String> namesForCategory = categoryMap.getOrDefault(rs.getString("category"), new ArrayList<>());
    namesForCategory.add(rs.getString("name"));
    categoryMap.put(rs.getString("category"), namesForCategory);

现在选择类别后,您可以使用categoryMap.get(name) 获取名称列表。

【讨论】:

【参考方案2】:

这使用 where 子句选项和 distinct 并显示如何将两个组合框与项目侦听器连接:

            JFrame frm = new JFrame();
            JComboBox catBox = new JComboBox();
            final Connection con = DriverManager.getConnection("jdbc:derby://localhost:1527/sample","app","app");
            String getcatsQuery = "SELECT DISTINCT category from PRODUCT";
            PreparedStatement getcatsStatement = con.prepareStatement(getcatsQuery);
            ResultSet rs = getcatsStatement.executeQuery();
            List<String> list = new ArrayList<>();
            while (rs.next()) 
                String cat = rs.getString("category");
                //add group list to the arraylist
                list.add(cat);
            
            rs.close();
            System.out.println("list = " + list);
            DefaultComboBoxModel catsModel = new DefaultComboBoxModel(list.toArray());
            catBox.setModel(catsModel);
            final JComboBox prodBox = new JComboBox();
            prodBox.addItem("             ");
            catBox.addItemListener(e -> 
                try 
                    String getprodsQuery = "SELECT name from PRODUCT where category=?";
                    PreparedStatement getprodsStatement = con.prepareStatement(getprodsQuery);
                    getprodsStatement.setString(1, catBox.getSelectedItem().toString());
                    ResultSet rs2 = getprodsStatement.executeQuery();
                    List<String> list2 = new ArrayList<>();
                    while (rs2.next()) 
                        String name = rs2.getString("name");
                        //add group list to the arraylist
                        list2.add(name);
                    
                    rs.close();
                    DefaultComboBoxModel prodsModel = new DefaultComboBoxModel(list2.toArray());
                    prodBox.setModel(prodsModel);

                 catch (SQLException ex) 
                    ex.printStackTrace();
                
            );
            catBox.setSelectedIndex(0);
            frm.setLayout(new FlowLayout());
            frm.add(catBox);
            frm.add(prodBox);
            frm.pack();
            frm.setVisible(true);

【讨论】:

伟大的工作兄弟它的工作Thnkx很多【参考方案3】:

你可能想使用这个query

String qr = "SELECT * FROM table_name WHERE category";

我认为你在这方面遇到了麻烦。

【讨论】:

以上是关于如何从一列中选择不同的类别数据?的主要内容,如果未能解决你的问题,请参考以下文章

如果索引列不同,则从一列中求和值?

将数据从一列插入另一个表的两列的过程

将数据从一列传输到不同表中的不同列

如何从一列中计算过去 X 周数据的百分比?

如何在R中的一列中添加具有不同值的新行

从数据库中选择一列中的值不同且限制为 5 个最新的行