2011-01-26 32 views
2

我想基於傳遞兩個IN()運算符來選擇一行,但對於同一列。以下是我所嘗試的:兩個IN()運算符,一列

SELECT DISTINCT `product_id`, `department` 
    FROM `products` 
WHERE `department` IN ('Star Wars', 'Scarface', 'Winnie the Pooh') 
    AND `department` IN ('T-Shirts', 'Frisbees', 'Waffles') 

查詢返回沒有結果。

products表包含兩個重要列:product_iddepartment。這將同一產品分配給多個部門。例如,有一個達斯維達T恤分配給三個不同的部門 - 星球大戰,T恤和華夫餅。

我試圖做一個表單,允許用戶搜索「達斯維德」,並指定只返回從「星球大戰」和「T恤」部門的結果,而跳過所有其他達斯維達紀念品。

什麼是實現這一目標的最佳途徑?

+0

`department`是VARCHAR?你如何將一個產品分配給多個部門? 'product_id`不是主鍵嗎?我們可以看到一些示例行嗎? – webbiedave 2011-01-26 18:32:20

回答

3

WHERE IN (...)基本上相當於where x='a' or x='b' or x='c'...。你在WHERE IN中所做的事情是說「部門必須是第一組和第二組的一部分,基本上」1是2是3「。

2

實際上,你的數據庫的結構是有些奇怪。你應該有一個products表和departments表和最後一個表product_to_deptt,將它們連接起來。

這樣的話,做你想做的事,會很容易。

1

你應該包括所有除非你故意嘗試SELECT只有它們的重疊值,如果你必須使用t他的語法如上所述,然後考慮使用OR

0

您正在尋找產品,其中部門在一個列表中,並在第二個列表中。假設這兩個部門列表是相互排斥的,內自聯接,可用於AND條件:

select p1.product_id 
    from products p1 
     inner join products p2 
      on p1.product_id = p2.product_id 
       and p2.department in ('T-Shirts', 'Frisbees', 'Waffles') 
    where p1.department in ('Star Wars', 'Scarface', 'Winnie the Pooh') 
1
SELECT * 
    FROM `products` 
WHERE `department` IN ('Star Wars', 'T-Shirts') 
    AND whatever_it_is = 'Darth Vader';