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 not in Subquery 查找 $user_id 不匹配或为 null 的每个服务。这些是卖家不提供的服务。
第一个子句查找他提供的服务。 case 语句以我喜欢的格式给出输出。
它确实有效,但是有没有办法改进它?
最佳答案
如果您想列出服务以及指示是否提供的"is"或“否”标志,您可以执行以下操作:
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;
您的问题没有指定详细信息
来自哪里,所以我猜测来自服务
。
您还可以将其写为左外连接
,假设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;
这可以处理来自任一表的详细信息
。
关于mysql - 有人可以改进这个查询吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26181219/