从一个表中选择不在另一个表中但具有特定条件的记录

时间:2016-06-22 10:27:52

标签: php mysql

我有三张桌子,我们称之为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.我的查询没有过滤,我也不知道该怎么做。

提前谢谢

3 个答案:

答案 0 :(得分:2)

不确定您期望的输出,但这会列出所有用户及其所有需求:

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的问题)。 在此查询之后,您可以使用数组解析结果,以便为单个用户分配多个商品,这样您就可以获得包含用户和分配商品的数组。

答案 1 :(得分:0)

使用子查询可能不是很漂亮,但这应该可以完成这项工作:

$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})";

答案 2 :(得分:0)

通常这是通过LEFT OUTER JOIN完成的(正如您所做的那样),但是在JOIN的ON子句中完成了特定的检查,而不仅仅是WHERE子句。然后检查表中已经LEFT OUTER JOIN的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是可能的,但随着卷的增加,往往会表现不佳。