在 SQL 查询中对单个列传递 AND 操作?

Posted

技术标签:

【中文标题】在 SQL 查询中对单个列传递 AND 操作?【英文标题】:Passing AND operation on a single column in SQL query? 【发布时间】:2015-05-04 17:47:08 【问题描述】:

如何在 SQL 查询中传递 AND 操作?这是我的查询:

select 
    distinct slr_product.seller_id, 
    slr_product.name,
    slr_product.price, 
    slr_seller.name 
from 
    slr_product join slr_seller 
where slr_product.seller_id = slr_seller.id 
and  slr_product.name in (
        "WEIL FELIX TEST*Proteus Antigen OX19, OX2 & OXK",
        "WIDAL TUBE AGGLUTINATION TEST",
        "ZINC, SERUM / PLASMA"
        ) 

我得到这样的结果: http://postimg.org/image/dhh57uzjn/

我也尝试了AND 操作而不是IN 操作,但我没有得到任何结果。我想根据 产品名称 显示 seller id,具有这 3 个产品名称。这里seller_id = 33 拥有这些产品。我正在使用 mysql

【问题讨论】:

您要添加样本数据和预期结果吗? 如果您只想要卖家拥有所有三种产品的结果,您将需要执行 3 个子查询或 3 个连接,或者使用 CTE 或 NOT EXISTS() 进行一些更复杂的逻辑 不,AND 不起作用,因为name 不能同时是两个值(除非不区分大小写)。 “AND X in (A, B, C)”等价于“AND (X = A OR X= B OR X=C)”。另外,为什么将连接条件(slr_product.seller_id = slr_seller.id)放在 WHERE 而不是 JOINs ON 中? 【参考方案1】:

试试这个,你可以得到那些拥有所有三个产品的seller_id

Select slr_seller.seller_id,slr_seller.saler_name
From slr_seller
Where seller_id IN 
    (
    SELECT DISTINCT seller_id 
    FROM slr_product 
    WHERE slr_product.name in ( 'WEIL FELIX TEST*Proteus Antigen OX19, OX2 & OXK',
                                'WIDAL TUBE AGGLUTINATION TEST',
                                'ZINC, SERUM / PLASMA') 
    GROUP BY seller_id 
    HAVING count(DISTINCT slr_product.name) = 3   //number of product 
    )

SQLFIDDLE

Updated SQlFiddle

编辑:- 带有产品名称

Select DISTINCT slr_seller.seller_id,slr_seller.saler_name, slr_product.name
From slr_seller join slr_product ON slr_product.seller_id = slr_seller.seller_id
Where slr_seller.seller_id IN (
SELECT DISTINCT seller_id 
FROM slr_product 
WHERE slr_product.name in ( 'WEIL FELIX TEST*Proteus Antigen OX19, OX2 & OXK',
                            'WIDAL TUBE AGGLUTINATION TEST',
                            'ZINC, SERUM / PLASMA') 
GROUP BY seller_id 
HAVING count(DISTINCT slr_product.name) = 3  )

SQLFIDDLE

【讨论】:

postimg.org/image/n4vjm4is7 但在没有子句的情况下得到了这样的结果......并且还尝试了没有子句显示的结果。 你能创建示例sqlfiddle,或者给我们你的表结构示例数据 @srinu t:- 我创建了 sqlfiddle(请参阅答案中的 SQLFIDDLE 链接),您可以检查它是否正常工作.. 实际上我想显示seller_id 并命名两者。但在这里我添加了仅显示单个记录的名称结果 现在修改sql查询获取seller_id和saler_name【参考方案2】:

有几种查询模式会返回指定的结果。

一种选择是将EXISTS 谓词与相关子查询一起使用。我认为这是最容易理解的,尽管对于大量值列表来说有点笨拙;并且很难扩展这种方法来处理“三分之二”类型的查询。而且这通常不是表现最好的,其他选项通常表现更好。

有了所有这些注意事项,作为这种方法的演示,只需附加到问题中的现有查询:

   AND EXISTS ( SELECT 1 FROM slr_product p1
                 WHERE p1.seller_id = slr_seller.id
                   AND p1.name = 'WEIL FELIX TEST*Proteus Antigen OX19, OX2 & OXK'
              )
   AND EXISTS ( SELECT 1 FROM slr_product p2
                 WHERE p2.seller_id = slr_seller.id
                   AND p2.name = 'WIDAL TUBE AGGLUTINATION TEST'
              )
   AND EXISTS ( SELECT 1 FROM slr_product p3
                 WHERE p3.seller_id = slr_seller.id
                   AND p3.name = 'ZINC, SERUM / PLASMA'
              )

还可以为卖家获取列表中产品的“计数”,然后对其进行过滤。相关子查询将为外部查询返回的每一行执行,所以这通常也不是最好的执行者,但这可以扩展为检查“2 out of 3”。只需将其附加到问题中现有查询的末尾即可:

   AND 3 = ( SELECT COUNT(DISTINCT p.name)
               FROM slr_product p
              WHERE p.seller_id = slr_seller.id
                AND p.name IN ( 'WEIL FELIX TEST*Proteus Antigen OX19, OX2 & OXK'
                              , 'WIDAL TUBE AGGLUTINATION TEST'
                              , 'ZINC, SERUM / PLASMA'
                              )
           )

我们有时可以通过将子查询作为内联视图运行,返回一组行,然后对其执行 JOIN 操作来获得更好的性能。

SELECT DISTINCT p.seller_id
     , p.name
     , p.price
     , s.name 
  FROM slr_product p
  JOIN slr_seller s
    ON s.id = p.seller_id
    -- inline view to return seller_id that sell all three products
  JOIN ( SELECT r.seller_id
           FROM slr_product r
          WHERE r.name IN ( 'WEIL FELIX TEST*Proteus Antigen OX19, OX2 & OXK'
                          , 'WIDAL TUBE AGGLUTINATION TEST'
                          , 'ZINC, SERUM / PLASMA'
                          ) 
          GROUP BY r.seller_id
         HAVING COUNT(DISTINCT r.name) = 3
       ) q
    -- only return seller_id that sell all three products
    ON q.seller_id = p.seller_id
 WHERE p.name in ( 'WEIL FELIX TEST*Proteus Antigen OX19, OX2 & OXK'
                 , 'WIDAL TUBE AGGLUTINATION TEST'
                 , 'ZINC, SERUM / PLASMA'
                 )

【讨论】:

以上是关于在 SQL 查询中对单个列传递 AND 操作?的主要内容,如果未能解决你的问题,请参考以下文章

使用列表参数批量插入/更新调用到 Dapper 中对数据库的单个操作/请求

MySQL的SQL语句 - 数据操作语句(13)- 子查询

在 MS Access 2007 中对 ODBC 表导入 sql 查询

SQL 查询将多条记录中的值组合到单个列中

以“列标题:列值”格式获取单个记录的 SQL 查询

SQL Server 中对大型数据集的慢速不同查询