2012-08-09 65 views
0

我有2個表格。INNER JOIN以及更多AND

table one: items 
table two: items_options 

現在我需要在表中的兩個

SELECT i.id FROM items as i 
INNER JOIN items_options as io ON i.item_id = i.id 
WHERE io.option_id = 60143 AND io.option_id = 60142 
ORDER BY i.xy ASC LIMIT 0,50 

我如何通過/有做沒有組2個options_ids搜索?

+1

'WHERE io.option_id = 60143 OR io.option_id = 60142'? – Kalpesh 2012-08-09 21:31:28

+0

你期望什麼樣的結果? – 2012-08-09 21:31:53

+0

我希望所有項目都有項目選項60143和項目選項60142 – user1576248 2012-08-09 21:47:27

回答

1

好像你要OR或使用IN聲明。

SELECT i.id 
    FROM items as i 
INNER JOIN items_options as io 
    ON i.item_id = i.id 
WHERE io.option_id IN (60143, 60142) 
ORDER BY i.xy ASC 
LIMIT 0,50 

OR

SELECT i.id 
FROM items as i 
INNER JOIN items_options as io 
    ON i.item_id = i.id 
WHERE io.option_id = 60143 OR io.option_id = 60142 
ORDER BY i.xy ASC 
LIMIT 0,50 

你不能有一個具有兩個值的option_id

編輯:如果你想這兩個值可以使用UNION ALL查詢:

SELECT x.id 
FROM 
(
    SELECT i.id, i.xy 
    FROM items as i 
    INNER JOIN items_options as io 
    ON i.item_id = i.id 
    WHERE io.option_id = 60143 
    UNION ALL 
    SELECT i.id, i.xy 
    FROM items as i 
    INNER JOIN items_options as io 
    ON i.item_id = i.id 
    WHERE io.option_id = 60142 
) x 
ORDER BY i.xy ASC 
LIMIT 0,50 

或者你可以嘗試加入的items_options表兩次:

SELECT i.id 
FROM items as i 
INNER JOIN items_options as io1 
    ON i.item_id = io1.id 
INNER JOIN items_options as io2 
    ON i.item_id = io2.id 
WHERE io1.option_id = 60143 AND io2.option_id = 60142 
ORDER BY i.xy ASC 
LIMIT 0,50 
+0

不,我希望所有項目都有項目選項60143和項目選項60142 – user1576248 2012-08-09 21:46:09

+0

@ user1576248請參閱我的編輯以查看是否適用於您 – Taryn 2012-08-09 21:49:35

+0

是您最後示例似乎不錯,但它是快速的 如果我搜索10選項ids我需要10加入? (50萬行..) – user1576248 2012-08-09 22:00:49

0

看起來你想要一個OR來代替AND。 items_options中不會有滿足這兩個條件的任何行。

WHERE io.option_id = 60143 OR io.option_id = 60142 
          ^^ 

另外,

WHERE io.option_id IN (60143,60142) 

你提到不想使用GROUP BY。這聽起來好像你不想返回重複的items.id值。你可以在選擇列表前加DISTINCT關鍵字來消除重複:

SELECT DISTINCT i.id FROM items as i 
0

也許工作更好地使用OR而不是ANDAND表明這兩種情況可能同時發生。由於您正在查找具有option_id = 60143的行以及具有option_id = 60142的行,因此使用OR可以獲得具有其中任一個的行。

SELECT i.id FROM items as i 
INNER JOIN items_options as io ON i.item_id = i.id 
WHERE io.option_id = 60143 OR io.option_id = 60142 
ORDER BY i.xy ASC LIMIT 0,50 
+0

不,我希望所有項目具有項目選項60143和項目選項60142 – user1576248 2012-08-09 21:44:54

+0

@ user1576248 - 那是怎麼回事?你在同一列有多個值? – scrappedcola 2012-08-09 21:51:01