2014-04-04 5 views
0

나는 결합하고 싶은 3 개의 테이블을 가지고있다.mysql에서 잘못된 데이터를 처리하는 방법은 무엇입니까?

나는 다음과 같은 쿼리를 실행해야합니다 :

DROP TABLE 
IF EXISTS testgiver.smart_curmonth_downs; 

CREATE TABLE testgiver.smart_curmonth_downs 


SELECT 
ldap_karen.uid, 
ldap_karen.supemail, 
ldap_karen.regionname, 
smart_curmonth_downs_raw.username, 
smart_curmonth_downs_raw.email, 
smart_curmonth_downs_raw.publisher, 
smart_curmonth_downs_raw.itemtitle, 
smart_items.`Owner` 
FROM 
smart_curmonth_downs_raw 
INNER JOIN ldap_karen ON smart_curmonth_downs_raw.username = ldap_karen.uid 
INNER JOIN smart_items ON smart_curmonth_downs_raw.itemtitle = smart_items.Title 

나는 테이블 smart_curmonth_downs_raw의 행과 항상 일대일 관계를 유지하면서 조인을 만드는 방법을 알고 싶어요.

예를 들어 ldap_karen에 uid가없는 경우 문제가 있습니다. 그리고 내가 찾은 마지막 쟁점은 CMS가 중복 된 itemtitle을 허용한다는 것입니다. 그래서 내 쿼리를 실행하는 경우 각 항목에 대한 행을 만들기 때문에 훨씬 많은 행이 표시됩니다. 예를 들어 smart_items에있는 마지막 itemtitle 만 잡을 수있는 방법이 있습니다. 난 단지 같은 수의 행을 유지하기를 원할 것이고 다른 테이블의 무결성 문제를 제어 할 수는 없다.

smart_curmonth_downs_raw 테이블은 원시 다운로드 정보 (다운로드 통계)이고 karen 테이블은 고유 한 사용자 정보를 추가하며 smart_items 테이블은 고유 항목 (다운로드) 정보를 추가합니다. 그것들은 모두 중요합니다. 사용자가 다운로드를했지만 karen 테이블을 두드린 경우 사용자 정보가 NULL로 표시되고 동일한 이름을 가진 smart_items에 하나 이상의 항목이있는 경우 가장 높은 항목 만보고 싶습니다. 신분증. 오른쪽 테이블이 오른쪽 테이블의 컬럼 값으로 사용 NULL 존재하지 않는 경우

그것은 smart_curmonth_downs_rawldap_karen의 관계 같은 소리
+1

smart_items에있는 ** 마지막 ** itemtitle을 어떻게 정의 하시겠습니까? 예를 들어 가장 최근의 datetime 값을 가진 열이 있습니까? 아니면 가장 큰 값을 원하는 증분 값입니까? (귀하의 질문에 smart_items 테이블 스키마를 공유해야합니다.) – AgRizzo

+0

@AgRizzo - 죄송합니다. smart_items 테이블은 실제로 적절한 키가있는 유일한 테이블입니다. 그래서 테이블에서 가장 높은 "id"필드가됩니다. "smart_curmonth_downs_raw"로 보고서를 가져올 때 ID는 itemtitle이 아니라 ... 시작하지 마십시오. 내가 본 최악의 기업 CMS 중 하나에 대해 분명히 말할 수 있습니다. – blankip

답변

0

, 당신은 첫 번째 테이블에 LEFT JOIN하는 모든 행을 사용하고자하는 의미, 선택 사항이며, .

smart_items 테이블의 마지막 항목과 관련하여이 쿼리를 사용할 수 있습니다.

SELECT title, MAX(id) AS max_id 
FROM smart_items 
GROUP BY title; 

다른 논리와 해당 쿼리를 결합하면 해결 방법으로 시도하십시오.

SELECT COALESCE(ldap_karen.uid, 'Unknown') AS uid, 
     COALESCE(ldap_karen.supemail, 'Unknown') AS supemail, 
     COALESCE(ldap_karen.regionname, 'Unknown') AS regionname, 
     smart_curmonth_downs_raw.username, 
     smart_curmonth_downs_raw.email, 
     smart_curmonth_downs_raw.publisher, 
     smart_curmonth_downs_raw.itemtitle, 
     smart_items.`Owner` 
FROM smart_curmonth_downs_raw 
INNER JOIN (SELECT title, MAX(id) AS max_id 
      FROM smart_items 
      GROUP BY title) AS most_recent 
    ON smart_curmonth_downs_raw.itemtitle = most_recent.Title;  
INNER JOIN smart_items 
    ON most_recent.max_id = smart_items.id 
LEFT JOIN ldap_karen 
    ON smart_curmonth_downs_raw.username = ldap_karen.uid; 
+0

smart_curmonth_downs_raw 테이블은 원시 다운로드 정보 (다운로드 통계)이고 karen 테이블은 고유 한 사용자 정보를 추가하며 smart_items 테이블은 고유 항목 (다운로드) 정보를 추가합니다. 그것들은 모두 중요합니다. 귀하의 질의에는 몇 가지 문제점이 있지만, 나는 그것을 전혀 해결할 수 있는지 알게 될 것입니다. – blankip

관련 문제