SELECT Services.Type, Description
, CASE
WHEN id = $user_id THEN 'YES'
ELSE 'NO'
END AS Checked
, Details
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
)
为了解释所涉及的表,SellerServices是一个表格,描述了特定卖家提供的服务。
服务描述了所有服务。
如果我没有加入这些表,一个简单的“select * from Services where 1”几乎可以实现返回哪些行的目标,但是因为它只是找到了一个能够完成任务的子查询:
第二个子句,其中不在子查询中的Services.Type找到$ user_id不匹配的每个服务,或者它为null。这些是卖方不提供的服务。
第一个条款找到他提供的服务。 case语句以我喜欢的格式提供输出。
它有效,但有没有办法改善它?
答案 0 :(得分:2)
如果您想列出服务以及"是"或"不"指示是否提供的标志,您可以执行以下操作:
select s.type, s.description,
(case when exists (select 1 from SellerServices ss where ss.Type = s.Type and ss.id = $user_id)
then 'YES'
else 'NO'
end) as Checked,
s.details
from services s;
您的问题并未指明details
的来源,因此我猜错services
。
您也可以将其写为left outer join
,假设SellerServices
表中没有重复项:
select s.type, s.description,
(case when ss.Type is not null
then 'YES'
else 'NO'
end) as Checked,
ss.details
from Services s left join
SellerServices ss
on ss.Type = s.Type and ss.id = $user_id;
这可以处理来自任何一个表的details
。