mysql - 有人可以改进这个查询吗?

标签 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 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/

相关文章:

mysql 从现有查询中的另一个表中获取列值

MySQL 错误 1241 (21000) : Operand should contain 1 column(s)

MySQL SUM 来自具有不同 GROUP BY 的多个列

jquery - 我想从 onkeyup 事件的数据库中检索信息,并使用 jquery 将其显示在文本框中

mysql - 如何在sql数据库中创建具有相同值和结构的列

c# - 如何将参数值放入SQL的前缀搜索中

sql - 如何检查两个值是否为空

每个 GROUP BY 的 MySQL n 个结果,按计数排序

php - 在 localhost xampp os x 上建立数据库连接时出错

python - Flask_mysql 给出错误 "ExtDeprecationWarning: Detected extension named flaskext.mysql please rename it to flask_mysql."