홈>
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
- 답변 # 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
의 열을 연결합니다 조인 테이블을 사용하면 행당 한 명의 고유 한 사용자가 있습니다.
관련 자료
- node.js - Firebase Firestore에서 문서를 쿼리 할 때 빈 쿼리 가져 오기
- google bigquery - 한도가 다른 Big Query에서 임의의 행을 가져 오나요?
- mysql - 고유 개수를 정렬하고 가져 오는 SQL 쿼리
- 필드에 null 값이있는 레코드를 가져 오기위한 Elasticsearch 쿼리
- sql - 여러 내부 조인 및 하위 쿼리에 대한 쿼리 최적화
- Query Optimization - 쿼리 최적화 - oracle sql에서 패턴을 반복하려면
- mysql - SQL 쿼리에서 오류 가져 오기
- python - SQL 쿼리, 반복 선택 제거
- arrays - SQL 쿼리 — ALL 및 '='연산자를 사용하여 예상 결과를 얻지 못함
- mysql - 이 SQL 쿼리를 수행 할 때 중복 된 열이 발생하는 이유는 무엇입니까?
- mysql - SubChild에서 Child to Parent 테이블로의 SQL 쿼리
- sql server - 다른 cte 쿼리에서 distinct top 목록 가져 오기
- oracle - 업데이트 SQL 쿼리 단일 행 하위 쿼리 중 오류가 발생하면 둘 이상의 행이 반환됩니다
- mysql - 여러 하위 쿼리 최적화를 통한 SQL 선택 쿼리
- 다중 필터 및 테이블 생성을 통한 Oracle SQL 쿼리 최적화
- sql - 여러 조인 문을 줄이기위한 쿼리 최적화
관련 질문
- java : 웹 앱을 처음 시작할 때 데이터베이스를 만들고 채우려면 어떻게 해야 합니까?
- php : Laravel 8 GROUP BY의 Eloquent는 각 유형 중 하나 대신 각 행을 반환합니다.
- mysql : 다른 테이블의 테이블 건너뛰기 레code에서 레code 추출
- mysql : LEFT JOIN 쿼리의 동일한 필드에 여러 AND 조건을 추가하는 방법
- mysql : 테이블을 쿼리하고 기준에 따라 특정 열을 요약하지만 다른 열은 요약하지 않는 방법은 무엇입니까?
- mysql : 매개변수에서 쉼표로 구분된 값을 비교하여 해당 값을 기반으로 ID를 가져옵니다.
- mysql : 컴파일러가 비활성화되어 있을 때 설치 프로그램 SQL이 실행되지 않는 이유는 무엇입니까?
- mysql : IN 절에서 동일한 ID를 가진 가격의 합계 찾기
- mysql : Azure VM에서 Wildfly 서버를 확장하는 방법
- mysql : 행 크기가 같지 않은 테이블 2개 조인
이것이 가장 빠른 해결책 일 것입니다
포맷 옵션에 대해서는 https://dev.mysql.com/doc/refman/5.7/en/group-by-functions.html#function_group-concat을 참조하십시오.
최종 출력에만 적합합니다. 예를 들어 취미에 쉼표가 포함되어 있으면 고유하게 구문 분석 할 수 없습니다.