SQL从左表中获取每个条目之一,并将右侧的存在视为布尔值

时间:2014-09-19 21:04:13

标签: mysql sql lamp

所以我已经达到了我想要的结果,但想知道是否有更好/更清洁的方法来做到这一点:

SELECT * from Services
LEFT JOIN SellerServices ON SellerServices.Type = Services.Type    
WHERE `id` =$user_id
OR
 Services.Type NOT IN
  (
    SELECT  SellerServices.Type
    FROM     SellerServices
    where id =$user_id
  )

这将返回左表中的所有条目(本例中为Services)。

我可以稍后测试结果中的$user_id = id field是否在我的html输出中将复选框设置为打开或关闭,但我所做的似乎有点笨拙和错综复杂。

有人知道更干净的方式吗?

3 个答案:

答案 0 :(得分:1)

你想要这样的东西吗?

select s.*,
       (exists (select 1 from SellerServices ss on ss.Type = s.type) ) as ExistsFlag
from services s
where s.id = $userid;

这将从services中选择所有行(和列)。如果第二个表中存在type,它会添加一个布尔值。

答案 1 :(得分:1)

如果你的查询返回了预期的结果,这里是juste调整的相同查询(可能性能更高):

SELECT S.*
    ,CASE
       WHEN S.id = $user_id THEN 'ON'
       ELSE 'OFF'
    END AS is_user
FROM Services S
LEFT JOIN SellerServices SS ON SS.Type = S.Type
LEFT JOIN SellerServices SSU ON SSU.id = S.id
                              AND SSU.Type = S.Type
WHERE S.id = $user_id
    OR SSU.id IS NULL

我使用与子查询相同的条件,而不是使用子查询,而是使用表SellerServices添加了第二个关联。 WHERE子句更具可读性,我检查id是否与用户ID匹配,如果不匹配,我检查第二个关节是否存在。

希望这会对你有所帮助。

答案 2 :(得分:0)

SELECT  * , 
CASE 
WHEN SS.id =1
THEN  'ON'
ELSE  'OFF'
END AS is_user
FROM Services S
LEFT JOIN SellerServices SS ON SS.Type = S.Type
WHERE SS.id =1
OR SS.id IS NULL 
OR SS.id != 1

(这是基于“https://stackoverflow.com/users/3975214/jo%c3%abl-salamin”的答案)

但是这给出了我想要的结果,我认为它更具可读性...我不知道它是否在性能上更好,但它是一个小数据集,所以在这种情况下无关紧要。