在 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 中对数据库的单个操作/请求