2013-10-02 2 views
3

다음은 가치가있는 2 개의 매우 큰 테이블을 간략하게 요약 한 것입니다.가장 효율적인 JOIN 쿼리 - MySQL

campaign 테이블

 
| id | uid | name | contact | pin | icon | 
| 1 | 7 | bob | ted  | y6w | yuy | 
| 2 | 7 | ned | joe  | y6e | ygy | 
| 3 | 6 | sam | jon  | y6t | ouy | 

records 테이블

 
| id | uid | cid | fname | lname | address | city | phone | 
| 1 | 7 | 1 | lars | jack | 13 main | lkjh | 55555 | 
| 2 | 7 | 1 | rars | jock | 10 maun | oyjh | 55595 | 
| 2 | 7 | 1 | ssrs | frck | 10 eaun | oyrh | 88595 | 

페이지는 기록 테이블을 통해 루프 및 HTML 테이블에 결과를 출력합니다. 기존 코드는 어떤 이유로 든 각 레코드에 대해 별도의 쿼리를 수행합니다. "select name from campaign where id = $res['cid']" 두 번째 쿼리를 없애고 일종의 조인을하고 싶습니다. 그러나 가장 효과적인 방법은 무엇입니까?

나는

SELECT * FROM records 

필요하고 단일 쿼리에도

SELECT name FROM campaigns WHERE campaigns.id = records.cid 

.

어떻게 효율적으로 수행 할 수 있습니까?

+0

SELECT a.name, B * 캠페인 A, 기록 B FROM WHERE a.id = b.cid – AliBZ

답변

2

단순히 두 테이블을 결합하십시오. 이미 필요한 WHERE 조건이 있습니다. 하나의 열에서 하나의 열만 선택하고 다른 열에서는 하나의 열만 선택하십시오. 좋아요 :

SELECT records.*, campaigns.name 
FROM records, campaigns 
WHERE campaigns.id = records.cid 

일치하는 캠페인이없는 레코드 행은 손실됩니다. 이를 방지하려면 다음과 같이 쿼리를 바꿔 :

SELECT records.*, campaigns.name 
FROM records LEFT JOIN campaigns 
ON campaigns.id = records.cid 

지금 대신 누락 된 행의 NULL 이름을 얻을 것이다.

+0

현재 내가 현재 가지고있는 것이 맞습니다. 나는 올바른 길을 알고 있습니다. –

+0

기다림, 아니오, 내 것이 왼쪽에 합류하지 않았습니다. –

+0

"왼쪽 가입은 ON과 함께합니다. , 아니 어디서? "- 보살핌? – AgRizzo

0
SELECT * 
FROM records 
LEFT JOIN campaigns 
on records.cid = campaigns.id; 

내부 조인 대신 왼쪽 조인을 사용하면 모든 레코드 항목이 계속 표시됩니다.

+0

왼쪽 조인은 '어디서'가 아니라 '켜짐'으로갑니다. OP가 요청한 것보다 많은 '캠페인'의 * 모든 열을 선택합니다. 인덱스 룩업이 전체 테이블 룩업으로 바뀔 수 있으므로 너무 많은 데이터를 요청하면 성능이 저하 될 수 있습니다. – MvG

+0

내 게시물에 내 댓글에 답하는 것이 다소 혼란 스러울 수 있습니다. 여기에 의견을 남기려고하자. 원래 대답은 'WHERE'라는 키워드를 사용하여 조인 조건을 나타 냈지만 Fluffeh는 내 의견을 게시 한 후 몇 초 만에 이미 내 의견을 편집하여 내 의견의 일부가 현재 쓸모 없게되었습니다. – MvG

+0

Gotcha - 내가 댓글을 달았을 때 다시 편집을 알지 못함 – AgRizzo

2

"가장 효율적인"부분은 대답이 매우 까다로워지는 부분입니다. 일반적으로이 작업을 수행하는 가장 좋은 방법은 두 테이블에 조인을 사용하여 쿼리를 작성하고 새끼 고양이에 대한 노래를 즐겁게 건너 뛰는 것입니다. 그러나 실제로는 훨씬 더 많은 요소에 달려 있습니다. 테이블의 크기는 쿼리의 오른쪽 열에 잘 맞습니까? 쿼리가 실행되면 몇 개의 레코드가 생성됩니까? 쿼리에서 결과가 정렬됩니까?

이것은 과학에 대한 예술이 시작되는 곳입니다. 설명 계획을보고, 무슨 일이 일어나고 있는지 이해하고,보다 효율적이거나 간단한 방법을 찾아보십시오. 때로는 데이터의 하위 세트 만 생성하는 from 절에서 두 개의 하위 쿼리를 실행하면 전체 테이블을 조인하고 거기에서 필요한 데이터를 선택하는 것보다 훨씬 효율적입니다.

이 질문에 대해 더 자세히 대답하려면 특정 사례에 대해 정확하기를 원하면 더 많은 정보가 필요합니다.

데이터베이스에서 이러한 사항 중 일부를 추측 할 경우 테이블 수가 수백만 개 미만이고 데이터베이스 성능이 양호한 경우 간단한 조인을 사용하여 다음을 제안합니다. EXACT 쿼리를 여러 번 다시 실행하는 경우 느린 쿼리조차도 MySQL에 의해 매우 잘 캐시 될 수 있으므로 잘 살펴보십시오.나는 끔찍한 specc'ed 컴퓨터에서 실행되는 응용 프로그램을 가지고 있습니다. 여기서 cron 작업은 밤새로드되는 새 데이터로 몇 가지 쿼리를 실행하고 모든 사용자는 캐시 된지 확인하기 위해 쿼리가 즉각적이라고 생각합니다. 때로는 정말 돈을 벌 수있는 작은 트릭입니다.

마지막으로, 실제로 SQL로 시작하거나 궁극적으로 익숙하지 않은 경우 - 조인, 하위 쿼리와 같은 쿼리의 기본 중간급 topcs를 많이 다루는 want to read this Q&A that I wrote 일 수 있습니다 , 집계 쿼리 및 기본적으로 더 많은 것들을 알고 가치가있다.

+0

매우 유효한 답변, 고맙지 만 매우 도움이되지 않습니다. –

+0

@Adelphia 불행히도 질문하신 질문을 토대로 철저하고 정확하게 답변을 드리는 것은 매우 어렵습니다. 쿼리의 효율성과 속도는 종종 몇 가지 아이디어를 하나로 모으고 여러 번 실행하며 가장 잘 작동하는 것을 확인하는 문제입니다. 매우 드물게 당신은 간단히 질의를보고 "당신이 ....면 가장 효율적"이라고 말할 수 있습니다. 특히 데이터베이스에서 많은 세부 사항을 조사 할 수 없다면 말입니다. – Fluffeh

1

당신은 더 읽기 때문에 INNER가 (새로운 ANSI 표준 ANSI-92) 조인을 사용하는 것이 훨씬 낫다과 쉽게 LEFT 또는 다른 유형 INNER을 대체 할 수있는,이 쿼리

SELECT records.*, campaigns.name 
FROM records, campaigns 
WHERE campaigns.id = records.cid 

를 사용할 수 있지만, 가입하십시오. 여기

SELECT records.*, campaigns.name 
FROM records INNER JOIN campaigns 
ON campaigns.id = records.cid 

더 설명 :.

  1. SQL Inner Join. ON condition vs WHERE clause
  2. INNER JOIN ON vs WHERE clause