我有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”?
答案 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