所以我已经达到了我想要的结果,但想知道是否有更好/更清洁的方法来做到这一点:
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输出中将复选框设置为打开或关闭,但我所做的似乎有点笨拙和错综复杂。
有人知道更干净的方式吗?
答案 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”的答案)
但是这给出了我想要的结果,我认为它更具可读性...我不知道它是否在性能上更好,但它是一个小数据集,所以在这种情况下无关紧要。