2014-05-23 43 views
-1

作爲一段laravel代碼的結果,我有以下MySQL查詢。我試圖通過分析結果查詢來找出代碼失敗的地方。在MySQL查詢中雙或在哪裏並且或者是

查詢應選擇所有twitter_statuses那裏是在twitter_status_tagstwitter_user_tags一個TAG_ID,但目前它返回所有那裏是在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; 

對於那些有興趣誰,這是我laravel應用程序代碼

$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

對不起,延遲應對。我設法使用模型關係來實現它。但是,這種解決方案會大大減慢數據的檢索速度。所以我在一些情況下恢復使用表格。我正在嘗試使用'where has'完成它' –

回答

0

內蒙古上都標記表的連接是給你的效果,你想外連接來獲得無,兩個或任一個

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

對於我的回覆中的延遲感到抱歉。我目前正試圖讓它與查詢結束。不是從項目開始,而是以twitter狀態開始,並使用「where has」結構檢查是否鏈接到項目。 –

0

WHERE子句過濾,記錄,其中以下任一爲真:

  • project_twitter_statuses . deleted_at IS NULL和twitter_user_tags。 ('3','6','8','12')
  • project_twitter_statuses . deleted_at IS NULL AND twitter_status_tags。 ('3','6','8','12')

此查詢中還有哪些篩選記錄是您的3個內部聯接。內部連接只會返回表格之間的匹配記錄,您將需要使用OUTER連接來避免過度篩選。

此外,表別名對於使代碼更易於閱讀非常有幫助。