簡體   English   中英

僅當行不存在時,codeigniter復合連接

[英]codeigniter complex join only if rows don't exist

我正在制作一個約會應用程序,就像溫德勒一樣。 用戶可以喜歡或不喜歡其他用戶,如果兩個用戶都喜歡彼此,他們就可以選擇互相聊天。 目前正在構建查詢以隨機抽取隨機配置文件及其中一張圖片:

$data = $this->db
->select('users.id,display_name,city,state,gender,users_pictures.picture')
  ->join('users_pictures','users_pictures.user_id = users.id')
  ->order_by('id','RANDOM')
  ->limit(1)
  ->where(array('users.approved'=>1,'users_pictures.approved'=>1))
  ->where(array('users.id !='=>$user_id))->get('users')->result_array();    

現在這里我很困惑。我有一個由likes_dislikes組成的表,包括user_id,foreign_user_id和event_type(喜歡,不喜歡)。

如果您已經不喜歡或喜歡用戶,我不希望他們在我的結果中。 我能想到處理這個問題的唯一方法是執行第二個查詢,然后檢查這個,然后再做一個“隨機”查詢,如果你已經喜歡/不喜歡它們,那么你只能看到你尚未評級的用戶。 有沒有更好的辦法?

任何幫助深表感謝 :)

這不是答案,但我沒有什么建議。

您可以將喜歡/不喜歡改為數字,-1(不喜歡),0或NULL(未分級),1(例如)。

它應該簡化/縮短您的查詢。

在此之后 - 您可以創建視圖/查詢(甚至更好 - SQL函數),它將計算2個用戶的評級總和,如果您考慮它,這樣的總和可用於許多任務。

您是否聽說過EXISTSNOT EXISTS MySQL命令? 后者是你應該嘗試的。

SELECT
 u.id, display_name, city, state, gender, up.picture
FROM
 users AS u
INNER JOIN
 users_pictures AS up ON up.user_id = u.id
WHERE
 NOT EXISTS(
    SELECT 
     1 
    FROM
     likes_dislikes
    WHERE
     ld.foreign_user_id = u.id AND ld.user_id = $loggedInUserId
 )

以上將列出所有用戶,不包括所有喜歡/不喜歡的用戶。 嘗試使用Codeigniter形成此SQL語句而不將值綁定是有點hacky。

谷歌的簡短調查(現在可能已經過時)表明以下內容應該是合適的。

//...rest of query
$db->where("
  NOT EXISTS (
    SELECT 1 
    FROM likes_dislikes 
    WHERE ld.foreign_user_id = u.id AND ld.user_id = $loggedInUserId
  ) AND 1 = ", 1); 

注意最后一部分AND 1 = ", 1);

如果使用左外連接,則會在左表中獲得右表中沒有匹配項的記錄。 (如此處所述http://www.khankennels.com/blog/index.php/archives/2007/04/20/getting-joins/

您可以通過CodeIgniter的活動記錄join()函數的第三個參數指定此連接類型。

因此,嘗試使用類似的東西:

$data = $this->db
             ->select('users.id,display_name,city,state,gender,users_pictures.picture')
             ->join('users_pictures','users_pictures.user_id = users.id')
             ->join('likes_dislikes', 'likes_dislikes.user_id = users.id', 'left outer')
             ->order_by('id','RANDOM')
             ->limit(1)
             ->where(array('users.approved'=>1,'users_pictures.approved'=>1))
             ->where(array('users.id !='=>$user_id))->get('users')->result_array();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM