Почему цикл While срабатывает 2 раза?

введите сюда описание изображенияПочему при выводе цикл While в Java срабатывает 2 раза? Нужен в итоге одинарный вывод. В таблице по одному значению Джон - кепка красная, Джон - кепка синяя. Почему тут повторяет? При попытке break; - остается только "кепка красная" , при выводе println за фигурную скобку - "кепка синяя"...

 sql = "SELECT * FROM `orders`";
        Statement statement = getDbConnection().createStatement();
        ResultSet result = statement.executeQuery(sql);

        System.out.println("Все заказы\n");

        // Далее выводим их, плюс получаем соответствующие записи из других таблиц
        while(result.next()) {
            // Получаем имя пользователя
            sql = "SELECT `login` FROM `users` WHERE `id` = '1' LIMIT 1";
            PreparedStatement prUsers1 = getDbConnection().prepareStatement(sql);
            ResultSet resUsers1 = prUsers1.executeQuery();

            String user_id2 = null;
            while (resUsers1.next()) {
                user_id2 = resUsers1.getString("login");
            }


            sql = "SELECT `title` FROM `items` WHERE `category` = ? " ;
            PreparedStatement prTovar1 = getDbConnection().prepareStatement(sql);
            prTovar1.setString(1, "hats");
            ResultSet resTovar1 = prTovar1.executeQuery();

            String item_id2 = null;
            while (resTovar1.next()) {
                item_id2 = resTovar1.getString("title");
               System.out.println(user_id2 + " - " + item_id2);
                            }
        }

Ответы (1 шт):

Автор решения: Nowhere Man

Основная проблема в том, что результаты запроса к таблице orders никак не используются внутри внешнего цикла.

Вероятно, код следует переписать следующим образом:

  1. Если id пользователя известен (1), прочитать и запомнить имя пользователя login для данного идентификатора отдельно 1 раз.
  2. Прочитать заказы для данного пользователя: SELECT * FROM `orders` WHERE user_id = ? <- 1
  3. Для каждого заказа, вычитать соответствующий товар с учётом текущего значения item_id: SELECT * FROM `items` WHERE id = ? <- item_id -- тогда фактически фильтр по категориям будет не нужен.
  4. Вывод результатов будет - для известного имени пользователя вывести текущее название товара.

Опять-таки, такой способ НЕ рекомендуется, так как он имитирует объединение данных из нескольких таблиц на стороне Java-кода вместо отправления одного корректного запроса с JOIN'ами.

Код не прилагаю в педагогических целях.

→ Ссылка