>

1 대 n 관계를 가진 두 개의 테이블이 있습니다. 테이블 취미에는 "userid"라는 테이블 사용자를위한 외래 키가 있습니다

SELECT * FROM hobbies WHERE userid = 7

는 여러 결과를 가질 수 있습니다. 테이블 사용자는 사용자 프로파일 데이터 목록을 포함하고 테이블 취미는 사용자 취미 목록을 포함합니다. 각 사용자의 취미가있는 여러 사용자의 프로필 정보 목록을 인쇄하고 싶습니다. (취미가 하나의 문자열로 연결됨) 현재 다음 SQL 쿼리가 있습니다. (의사 코드) :

ResultSet result = executeQuery("SELECT * FROM users;");
for each returned row: executeQuery("SELECT * FROM hobbies WHERE userid =" + result.getInt("ref"));

많은 사용자 목록으로 성능을 최적화하기 위해 SQL 쿼리를 루프 밖으로 가져 오려면 어떻게해야합니까?

LEFT JOIN을 시도한 다음 SQL 대신 java에서 WHERE ref = check을 수행하려고했습니다. 문제는 내가 중복 사용자를 얻고 결과 세트를 처리 할 때 각 사용자에 대해 한 행만 인쇄하고 싶다는 것입니다 또한 더 많은 행을 처리해야하기 때문에 JOIN이 실제로 성능 향상인지 확실하지 않습니다.

table users
+--------+------+---------+--------+
| userid | name | country | telno  |
+--------+------+---------+--------+
|      1 | John | USA     | 123456 |
|      2 | Max  | Germany | 345678 |
+--------+------+---------+--------+
+--------------+------------+
| userid       |hobby       |
+--------------+------------+
|            1 | football   |
|            1 | basketball |
|            2 | TV         |
|            2 | Music      |
|            2 | football   |
+--------------+------------+
example output:
John, USA, 123456, {football, basketball}
Max, Germany, 345678, {TV, Music, football}

  • 답변 # 1

    이것이 가장 빠른 해결책 일 것입니다

    SELECT name, country, telNo, GROUP_CONCAT(hobby)
    FROM users u LEFT JOIN hobbies h ON u.id = h.userId
    GROUP BY name, country, telNo
    
    

    포맷 옵션에 대해서는 https://dev.mysql.com/doc/refman/5.7/en/group-by-functions.html#function_group-concat을 참조하십시오.

    최종 출력에만 적합합니다. 예를 들어 취미에 쉼표가 포함되어 있으면 고유하게 구문 분석 할 수 없습니다.

  • 답변 # 2

    시도 할 수 있습니다.

    SELECT h.userid, h.allyouneed FROM hobbies h, users u WHERE h.userid =u.userid
    
    

    하나의 쿼리로 정보를 얻습니다

  • 답변 # 3

    "SELECT * FROM hobbies h join users u on h.userid = u.userid WHERE userid = ?"
    preparedStatement.setInt(result.getInt("ref"));
    
    

    모든 취미를 아래 '도서'예와 유사한 목록에 저장할 수 있습니다.

    public static List<String> selectAll() throws SQLException {
            PreparedStatement ps = null;
            ResultSet rs = null;
            // THE LIST OF BOOKS YOU WILL RETURN
            List<String> books = new ArrayList<>();
            String sql = "SELECT BOOK FROM BOOKs";
            try(Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/bookshop", "root", "");){
                ps = conn.prepareStatement(sql);
                rs = ps.executeQuery();
                while(rs.next()){
                    String book= rs.getString ("BOOK");
                    // ADD BOOK TO THE LIST
                    books.add(book);
                }
            }
            finally{
                ps.close();
                rs.close();
            }
            // RETURN LIST OF ALL BOOKS
            return books;
        }
    
    

  • 답변 # 4

    SELECT u.userid,u.name,u.country GROUP_CONCAT(hobby SEPARATOR ',') 
    FROM hobbies as h join users as u on h.userid=u.userid 
    where h.userid = ? GROUP BY u.userid,u.name,u.country;
    
    

    당신이 hobbies 에 관계가 있다고 가정   users 로 . 쿼리는 hobby 의 열을 연결합니다  조인 테이블을 사용하면 행당 한 명의 고유 한 사용자가 있습니다.

  • 이전 c# - 내 기능이 SRP 또는 기타 모범 사례를 위반합니까?
  • 다음 javascript - MV *를 사용할지 또는 MV *를 사용할지 선택할 수 없습니다