[英]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個用戶的評級總和,如果您考慮它,這樣的總和可用於許多任務。
您是否聽說過EXISTS
而NOT 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.