如何在SQL查询中进行传递和操作?以下是我的疑问:
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操作符,但是没有得到结果。我想显示卖方id基于产品名称,具有这3种产品的名称。这里seller_id = 33有这些产品。我正在使用MYSQL。
发布于 2015-05-04 18:02:57
试试这个,你可以得到那些拥有三种产品的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
更新的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
发布于 2015-05-04 19:49:54
有几个查询模式将返回指定的结果。
一种选择是在相关子查询中使用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 / 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'
)
)有时,通过将子查询作为内联视图运行,返回一组行,然后执行连接操作,我们可以获得更好的性能。
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'
)https://stackoverflow.com/questions/30036523
复制相似问题