簡體   English   中英

從一個表中選擇不在另一表中但具有特定條件的記錄

[英]Select records from one table that are not in another table but with specific conditions

我有三個表,我們稱它們offersusersdemands

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.

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