3NF数据库设计(和条件)

时间:2014-04-03 00:17:27

标签: mysql sql

我有3NF设计(Tag,Item_Tag,Item)

如下所示,但它无法正常工作,因为我多次循环使用相同的旧cloumn。

我正在尝试使用AND CONDITION获取标记列表。在OR条件下,我只需要做一个whereIn但是有一个AND条件,我迷失了我实际上可以用它去做。

*More explanation*

ItemID TagID

203     45
203     60
203     61
203     62

204     45
204     50
204     51
204     52

假设我正在尝试获取Tag = 45和tag = 60(和条件)的所有ItemID

这是我目前的代码,它无法正常工作。

  $itemID = DB::table('item_tag')
                     ->where(function($query) use($ID)
                     {
                         foreach($ID as $uID){
                             $query->where('tag_id', '=', $uID);
                         }
                     })->lists('item_id');

潜在解决方案1 ​​

select * from question q inner join 
question_has_tag qt where tag_id in 
(select tag_id from tags where (what we want) 
minus select tag_id from tags where (what we don't)

潜在解决方案2

SELECT * FROM items WHERE  
    EXISTS (SELECT 1 FROM item_tag WHERE id = item_id AND tag_id = tag1)  
    AND EXISTS (SELECT 1 FROM item_tag WHERE id = item_id AND tag_id = tag2)  
    AND ...

这是可能的吗?我怎么能做解决方案1& 2与Laravel 4.提前致谢。

1 个答案:

答案 0 :(得分:0)

select * from question q 
inner join question_has_tag qt 
    ON ...
where tag_id in (select tag_id from tags where (what we want)) 
    AND tag_id NOT IN (select tag_id from tags where (what we don't))

我认为这是你正在寻找的逻辑,请注意缺少的ON子句。

如果表格被正确编入索引,那么最好为(select tag_id from tags where (what we want))创建#tmp表并使用内部联接而不是子查询。