[英]Select records from one table that are not in another table but with specific conditions
我有三個表,我們稱它們offers
, users
和demands
。
Table users
id | name
1 A
2 B
3 C
Table demands
id | id_user_fk
1 1
2 2
3 3
Table offers
id | id_demand_fk | id_user_fk
1 1 1
2 1 2
3 1 3
4 2 1
5 2 2
6 2 3
這是我的問題。 目的是為用戶分配需求,以便他們發布報價。 當我分配這些用戶時,我有一個bootstrapTable,它使我可以在offers
表中進行編寫。
這是我為獲取用戶列表而進行的查詢:
SELECT u.id "
. "FROM users u "
. "LEFT JOIN offers o on o.id_user_fk = u.id "
. "WHERE o.id_demand_fk <> " . $id . " OR u.id is null "
. "GROUP BY u.id"
目的是僅顯示尚未分配給要約的用戶(這就是為什么我使用$ id的原因)。 問題是,將用戶1、2和3都分配給了需求1和2,所以當我打開應該顯示可以分配給需求2的用戶的視圖時,我確實有用戶1、2和3,因為他們已經被分配了要求1.我的查詢未對此進行過濾,也不知道如何執行此操作。
先感謝您
不確定您期望的輸出是什么,但這列出了所有用戶及其所有要求:
SELECT u.id, o.id_demand_fk FROM users u LEFT JOIN offers o on o.id_user_fk = u.id WHERE o.id_demand_fk <> 999 OR u.id is null
如您所見,我刪除了組,因為組將始終僅顯示一個組(您在組1中遇到的問題)。 查詢之后,您可以使用數組解析結果以將多個商品分配給單個用戶,這樣您就可以獲得一個包含用戶和分配商品的數組。
使用子查詢也許不是很漂亮,但這應該可以完成工作:
$sql = "SELECT u.id FROM users u WHERE u.id NOT IN (SELECT o.id_user_fk FROM offers o WHERE o.id_demand_fk = {$demandId})";
通常,這是通過LEFT OUTER JOIN完成的(如您所完成的),但是要在JOIN的ON子句中完成特定的檢查,而不僅僅是WHERE子句。 然后,您在已被LEFT OUTER JOINed的表中檢查NULL字段,以檢查未找到匹配項:-
SELECT u.id
FROM users u
LEFT OUTER JOIN offers o ON o.id_user_fk = u.id AND o.id_demand_fk = " . $id . "
WHERE o.id IS NULL
帶有子查詢的IN是可能的,但是隨着容量的增加,其性能往往很差。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.