如何选择其他表中不存在的行?

时间:2019-01-15 16:42:53

标签: php sql pdo

我有3张桌子:

僵直

-------------------
| pot (PK) | naam | 
-------------------
| 1        | dust |
| 2        | iron |
| 3        | gold |
-------------------

stoftesten

-----------------------------------------------------------------------
| id (PK) | score | done | stofid (FK : pot) | userid (FK : username) |
-----------------------------------------------------------------------
| 1       | 75    | Ja   | 1                 | user01                 |
| 2       | 25    | Ja   | 2                 | user01                 |
| 3       | 85    | Ja   | 2                 | user02                 |
-----------------------------------------------------------------------

用户

-------------------------------------------
| username (PK) | name | rol      | basis |
-------------------------------------------
| user01        | Ben  | geleider | VLB   |
| user02        | Tom  | geleider | GER   |
-------------------------------------------

这3个表都在此查询中使用:

SELECT * 
FROM stoffen 
INNER JOIN stoftesten ON stoffen.pot = stoftesten.stofid 
INNER JOIN users ON users.username = stoftesten.gebruikersid 
WHERE stoftesten.done = 'Ja' and users.username = '$pers->username' 
ORDER BY naam";

它列出所有链接到“ stoftest”的“ stoffen”。 user01得到一个包含灰尘和铁的列表,user02得到一个仅包含铁的列表。

我想知道是否有一种方法可以列出不在此列表中的未使用项目列表。所以我这样做了:

SELECT * 
FROM stoffen 
LEFT JOIN stoftesten ON stoffen.pot = stoftesten.stofid 
LEFT JOIN users ON users.username = stoftesten.gebruikersid
WHERE stoftesten.gedaan IS NULL
ORDER BY stoffen.naam;

这至少创建了我想要的列表。当我登录到另一个帐户时,会得到相同的“不在列表中”列表。这是可以理解的,因为我没有指定任何用户。

但是我找不到办法。 “ stoftesten”表连接“ stoffen”和“ users”。有什么方法可以只显示不在列表中但每个用户都不同的“ stoffen”?

1 个答案:

答案 0 :(得分:0)

使用cross join生成所有行。然后使用LEFT JOIN获取匹配项并过滤出实际匹配的所有行:

select s.pot, u.username
from stoffen s cross join
     users u left join
     stoffentesten st
     on s.pot = st.stofid and u.username = st.gebruikersid
where st.stofid is null
相关问题