有人可以改进此查询吗?

时间:2014-10-03 14:47:47

标签: mysql sql subquery left-join lamp

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语句以我喜欢的格式提供输出。

它有效,但有没有办法改善它?

1 个答案:

答案 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