2012-01-24 6 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 t2 
WHERE project_id = $project_id 
ORDER BY id 

книги, как эта

SELECT id, label 
FROM t1 
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), что приведет к избыточности project_id и user_id в t3. – Dancrumb

+0

t3 содержит только информацию о том, как книги, от t1 относятся к ящикам в t2. В основном, какая книга была помещена в поле и с каким пользователем. t3 используется только администратором, который может видеть всю историю транзакций с итогами. Данные t2 создаются пользователями. – santa

ответ

0

Значит, пользователи заполняют свои собственные ярлыки в виде какого-то типа? Я бы предложил, что вы говорили, создавая новую таблицу: id, box_id, метки (с s и текстовое поле). Сохраните все допустимые имена ярлыков в столбце меток (так что скажем, поле id 1 было для всех разных типов ящиков, которые вы добавили бы в новую таблицу box_id = 1, labels = "разное, разное, разное, дополнительное, другое, неизвестное »и т. д. Затем, когда пользователь создает новый ярлык, перекрестно ссылайтесь на него со всеми допустимыми ярлыками для всех полей. Если есть совпадение, вытащите из таблицы точный 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 
} 
Смежные вопросы