如何不选择带有链接表的行

时间:2016-12-27 14:20:26

标签: mysql sql

我有3张桌子:

商店

--------------------------------------------------
|  ID        | STORE            |
--------------------------------------------------
|   -  1    | Store1 |
--------------------------------------------------
|    -  2    | Store2 |
--------------------------------------------------
|    - 3    | Store3 |
--------------------------------------------------
|   -  4   | Store4 |
--------------------------------------------------

用户

--------------------------------------------------
| ID       | USER           |
--------------------------------------------------
|   -  1    | User1 |
--------------------------------------------------
|    -  2    | User2 |
--------------------------------------------------
|    - 3    | User3 |
--------------------------------------------------
|   -  4   | User4 |
--------------------------------------------------

User_stores

--------------------------------------------------
| USER        | STORE            |
--------------------------------------------------
|    ---  1 --   | ----1----- |
--------------------------------------------------
|    ---  1 --   | ----2----- |
--------------------------------------------------
|    --- 2 --   | ----1----- |
--------------------------------------------------
|    ---  2 --   | ----2----- |
--------------------------------------------------
|    ---  3 --   | ----3----- |
--------------------------------------------------

我正在使用它作为我的选择。

SELECT S.id, S.store
FROM stores S
JOIN user_stores L
ON S.id = L.store
JOIN users U 
ON U.id = L.user
WHERE L.user <> ?

我的问题:

我正在尝试选择链接到每个人的每个商店除了当前用户(也就是用户ID)。此查询确实选择了未链接​​到当前用户的商店,但仍然存在问题。

我的查询仍然选择当前用户拥有的商店,只有当另一个用户也将此商店链接到该商店时(因为这是一个链接到其他用户的行)。

是否可以仅使用可用的用户ID从select语句中排除这些条目?

解决

SELECT S.id, S.store
FROM stores S
JOIN user_stores L
ON S.id = L.store
JOIN users U 
ON U.id = L.user
and L.user <> ?
and S.id not in (
select L.store from user_stores L
where L.user = ?
);

2 个答案:

答案 0 :(得分:1)

您可以使用NOT IN过滤掉给定用户拥有的商店:

SELECT S.id, S.store
FROM stores S
JOIN user_stores L
ON S.id = L.winkel
JOIN users U 
ON U.id = L.user
and L.user <> ?
and s.store not in (
    select store from user_stores u
    where user = ?
);

答案 1 :(得分:0)

我会通过对User_stores表中的商店使用条件聚合来解决此问题。 HAVING子句中出现的两个条件检查商店是否显示除一个用户以外的所有用户,并且未关联的用户是您选择的用户(由问号表示)。

SELECT STORE
FROM User_stores
GROUP BY STORE
HAVING COUNT(DISTINCT USER) = (SELECT COUNT(*) FROM Users) - 1 AND
       SUM(CASE WHEN USER = ? THEN 1 ELSE 0 END) = 0