首页 > 解决方案 > 如何选择不同表中不存在的行?

问题描述

我有 3 张桌子:

斯托芬

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

硬测试

-----------------------------------------------------------------------
| 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”?

标签: phpsqlpdo

解决方案


使用 across join生成所有行。然后使用 aLEFT 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

推荐阅读