2012-01-24 77 views
0

我想更好地了解我需要为我的下一个项目做些什么。创建一个虚拟合并组

我有3分贝表。

t1 (book) 
----------- 
id 
project_id 
label 


t2 (box) 
----------- 
id 
project_id 
creator_id 
label 

t3 (how they relate to each other) 
----------- 
id 
box_id 
book_id  
project_id 
user_id 

t1.id = t3.boo_id 
t2.id = t3.box_id 
t2.creator_id = t3.user_id 

书可以放在盒子里面并且盒子被贴上标签。我的脚本保持每盒的书总数。它可以正常工作,直到不同的用户开始将相同的书放入盒子并以不同的方式命名它们,但是关闭。

我希望能够实现某种形式的“虚拟合并”在那里我可以选择几个类似盒子的标签,像:其它杂项。,指定我自己的标签,说MISC并让脚本把它看作是这三个盒子里的书都在这个新盒子里面。

不知道该怎么做。我不想将这些永久合并。我最终会添加一个功能来从合并组中删除一些“框”,并让脚本重新计算总计。

我想我需要添加一个新表:

t4 
---------- 
id 
box_id 
label 

目前我的脚本抓住这样的箱信息:这样

SELECT id, label 
FROM t1 
WHERE project_id = $project_id 
ORDER BY id 

和总

SELECT id, label 
FROM t2 
WHERE project_id = $project_id 
ORDER BY id 

书像这样的计数

SELECT COUNT(DISTINCT user_id) AS cnt 
FROM t3 
WHERE project_id = $project_id 

我该如何重写查询,因为可能有或没有“合并组”?

+0

我是有点困惑,你似乎在t3中有冗余信息,在那个盒子里似乎属于单个项目和创建者(每个t2),这会在t3中呈现project_id和user_id冗余。 – Dancrumb

+0

t3仅包含来自t1的书与t2中的方框有关的信息。基本上哪本书放在哪个盒子里,哪个用户。 t3仅供管理员使用,可以查看总计的所有交易历史记录。 t2数据由用户创建。 – santa

回答

0

因此,用户正在用某种形式或某种形式填写自己的标签?我会建议你创建一个新的表设置:id,box_id,标签(与s和文本字段)。将所有可接受的标签名称存储在标签列中(也就是说box id 1用于添加到新表格中的所有其他类型的box box_id = 1,labels =“misc,miscellaneous,misc。,extra,other,unknown “等,然后当用户创建一个新的标签时,将其与所有盒子的所有可接受标签进行交叉引用,如果匹配,从表格中提取出确切的box_id,重新将书籍分配给相应的框将书籍放入这个盒子,他们把自己的箱子后没有再试图进行合并。

我想可能有这样的事情

$box_label = $_POST['label']; 

$getrelatedboxes = mysql_query("SELECT box_id, MATCH(labels) AGAINST('$box_label' IN BOOLEAN MODE) AS relation FROM newtable HAVING relation > 0 ORDER BY relation DESC LIMIT 1"); 
$related_boxes = mysql_num_rows($getrelatedpages); 

if($related_boxes){ 

$box_id = mysql_fetch_assoc($getrelatedboxes); 

// insert books into that box 

} 
else { 
// create new label and insert those books into that box 
}