2015-05-04 16 views
0

如何在SQL查詢中傳遞AND操作?這裏是我的查詢:在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/

我也試過,而不是IN操作AND操作,但我沒有得到結果。我想顯示賣家ID基於產品名稱,有這3個產品名稱。這裏有seller_id = 33有這些產品。我正在使用MYSQL。

+0

是否要添加樣本數據和預期結果? – dotnetom

+0

如果您只想要賣方擁有全部三種產品的結果,您需要做3個子查詢或3個連接,或者一些更復雜的CTE或NOT EXISTS邏輯() –

+0

不,AND不起作用,因爲'name '不能同時有兩個值(禁止不區分大小寫)。 「(A,B,C)中的AND X等價於」AND(X = A或X = B或X = C)「。另外,爲什麼將聯接條件(slr_product.seller_id = slr_seller.id)放在WHERE中而不是在JOINs ON中? – Uueerdo

回答

0

試試這個,你可以得到誰擁有這三種產品

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

編輯這些seller_id: - 有產品名稱

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

+0

http://postimg.org/image/n4vjm4is7/,但得到了像沒有條款的結果...並且還試圖使條款displyed沒有結果。 –

+0

您可以創建示例sqlfiddle,或給我們您的示例數據與表結構 – HaveNoDisplayName

+0

@ srinu t: - 我創建sqlfiddle(SEE SQLFIDDLE鏈接在答案),你可以檢查它正在工作.. – HaveNoDisplayName

0

有幾種查詢模式將返回指定的結果。

一種選擇是使用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中的2」。只是追加這在問題的現有查詢的末尾:

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' 
       )