我有三张桌子,我们称之为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.我的查询没有过滤,我也不知道该怎么做。
提前谢谢
答案 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是可能的,但随着卷的增加,往往会表现不佳。