2014-05-23 1 views
-1

다음과 같은 MySQL 쿼리를 가지고 있습니다. 그리고 결과 쿼리를 분석하여 코드가 실패한 곳을 파악하려고합니다. twitter_status_tags또는twitter_user_tags에 tag_id이 곳MySQL 쿼리가 OR 대신에 OR 대신에

쿼리는 모든 twitter_statuses를 선택해야하지만, 현재는 twitter_status_tagstwitter_user_tags에 tag_id이 모든 twitter_statuses을 반환합니다.

내가 알 수있는 한, 아래 쿼리는 OR을위한 것이지만, 분명히 MySQL은 그렇지 않다고 생각합니다. 관심이있는 사람들을 위해

SELECT * 
FROM `project_twitter_statuses` 
     INNER JOIN `twitter_statuses` 
       ON `twitter_statuses`.`id` = 
        `project_twitter_statuses`.`twitter_status_id` 
     INNER JOIN `twitter_user_tags` 
       ON `twitter_user_tags`.`twitter_user_id` = 
        `twitter_statuses`.`twitter_user_id` 
     INNER JOIN `twitter_status_tags` 
       ON `twitter_status_tags`.`twitter_status_id` = 
        `twitter_statuses`.`id` 
WHERE `project_twitter_statuses`.`deleted_at` IS NULL 
     AND (`twitter_user_tags`.`tag_id` IN ('3', '6', '8', '12') 
       OR `twitter_status_tags`.`tag_id` IN ('3', '6', '8', '12')) 
GROUP BY `twitter_statuses`.`id` 
ORDER BY `twitter_statuses`.`datetime` ASC; 

, 이것은 당신이 외부 아무것도 얻을 조인하려면, 당신에게 미치는 영향을주고있다

$projectTwitterStatuses = ProjectTwitterStatus::join('twitter_statuses','twitter_statuses.id','=','project_twitter_statuses.twitter_status_id'); 

// Tags 
if(!empty($tagsSelectedArray)) { 
    $projectTwitterStatuses = $projectTwitterStatuses 
     ->join('twitter_user_tags','twitter_user_tags.twitter_user_id','=','twitter_statuses.twitter_user_id') 
     ->join('twitter_status_tags','twitter_status_tags.twitter_status_id','=','twitter_statuses.id') 
     ->where(function($query) use ($tagsSelectedArray) 
     { 
      $query->orWhereIn('twitter_user_tags.tag_id',$tagsSelectedArray) 
        ->orWhereIn('twitter_status_tags.tag_id',$tagsSelectedArray); 
     }) 
     ->groupBy('twitter_statuses.id'); 
} 

$projectTwitterStatuses = $projectTwitterStatuses->orderBy('twitter_statuses.datetime') 
    ->paginate(10); 
+0

테이블이 서로 어떻게 관련되어 있는지 알 수 있습니까? Eloquent를 사용하여 테이블을 연결할 수 있습니까? –

+0

응답이 늦어 져서 죄송합니다. 나는 그것을 모델 관계를 사용하여 작동시킬 수 있었다. 그러나 이러한 솔루션은 데이터 검색 속도를 크게 저하시킵니다. 그래서 나는 어떤 경우에 테이블을 사용하기로 되돌아 갔다. 나는 curently 그것을 사용하여 끝내려고 노력하고 있어요. 내 응답이 지연되어서 죄송합니다. –

답변

0

는 내부가 모두 태그 테이블에 조인 내 laravel 응용 프로그램의 코드이며, 모두 또는 하나

SELECT * 
FROM `project_twitter_statuses` 
INNER JOIN `twitter_statuses` ON `twitter_statuses`.`id` = `project_twitter_statuses`.`twitter_status_id` 
Left JOIN `twitter_user_tags` ON `twitter_user_tags`.`twitter_user_id` = `twitter_statuses`.`twitter_user_id` 
Left JOIN `twitter_status_tags` ON `twitter_status_tags`.`twitter_status_id` = `twitter_statuses`.`id` 
WHERE `project_twitter_statuses`.`deleted_at` IS NULL 
AND (
`twitter_user_tags`.`tag_id` 
IN (
'3', '6', '8', '12' 
) 
OR `twitter_status_tags`.`tag_id` 
IN (
'3', '6', '8', '12' 
) 
) 
GROUP BY `twitter_statuses`.`id` 
ORDER BY `twitter_statuses`.`datetime` ASC; 

Where (`twitter_user_tags`.`twitter_user_id` is not null) Or 
     (`twitter_status_tags`.`twitter_status_id` is not null) 
추가

은 두 태그가없는 레코드를 잘라냅니다.

+0

. 나는 현재 쿼리를 끝내기 위해 노력하고있다. 프로젝트에서 시작하지 않고 트위터 상태를 사용하고 프로젝트에 링크되어 있는지 확인하기 위해'where has' 구조체 검사를 사용합니다. –

0

WHERE 절은 다음 중 하나에 해당하는 레코드를 필터링된다

  • project_twitter_statuses을 . deleted_at가 NULL AND twitter_user_tags된다. tag_id IN ('3', '6', '8', '12')
  • project_twitter_statuses . deleted_at은 NULL이고 twitter_status_tags입니다. tag_id IN ('3', '6', '8', '12')

또한이 쿼리의 필터링 레코드는 3 개의 내부 조인입니다. 내부 조인은 테이블간에 일치하는 레코드 만 반환하므로 과도한 필터링을 피하려면 OUTER 조인을 사용하는 것이 좋습니다.

또한 테이블 별칭은 코드를 읽기 쉽게 만드는 데 매우 유용합니다.