我有一个清单应用程序,我正在尝试为其设计数据库。
清单由一组标签(清单的部分)组成,每个标签都有许多checklist_items。可以启动并完成清单。完成后,用户可以在之后创建新的核对表。我正在尝试设计数据库,但令我困惑的是我如何设计它以便我可以查询类似的内容:
在创建的所有清单中,“家庭”标签上的项目已被检查了多少?
我有一个初步设计:
当我创建我的第一个清单时,我的选项卡表格如下:
tab_id, checklist_id, name
1, 1, "Household"
2, 1, "Outdoors"
3, 1, "Work"
4, 1, "School"
我的checklist_item标签如下:
checklist_item_id, checklist_id, tab_id, checked
1, 1, 1, 0
2, 1, 1, 0
3, 1, 1, 0
4, 1, 2, 0
5, 1, 2, 0
6, 1, 2, 0
7, 1, 3, 0
8, 1, 3, 0
9, 1, 3, 0
10, 1, 4, 0
11, 1, 4, 0
12, 1, 4, 0
清单项只知道tab_id,当有多个清单时,它就不像说select from checklist_item where tab_id = 1
那么容易,因为家里会有更多的标签条目,所以我怎么能找到像查询上面?还有,到目前为止我的设计是不是很糟糕?有没有更好的方法来解决这个问题?
编辑:值得一提的是我是数据库设计的新手
答案 0 :(得分:0)
你的桌子很好。您仍然可以使用查询SELECT * FROM checklist_item WHERE tab_id = 1
,因为tab_id唯一地确定了checklist_id(即每个选项卡属于特定的清单),因此不同清单的Household条目之间不会有任何混淆(每个清单都有自己的tab_id)
如果您希望在所有清单中获取「家居」项目,请将checklist_item加入标签,如下所示:
SELECT i.*
FROM checklist_item i
INNER JOIN tab t ON i.tab_id = t.tab_id
WHERE t.name = 'Household'
答案 1 :(得分:0)
我用http://www.w3schools.com/sql/sql_join.asp
学到了它我认为你错过了查询中的联接。
SELECT CI.checklist_item_id, CIchecked, T.checklist_ID, T.name, C.time_started, C.time_ended
FROM checklist_item CI
LEFT JOIN tab T ON CI.tab_id = T.tab_id
LEFT JOIN checklist C ON CI.checklist_id = C.checklist_id
WHERE tab_id = 1