我做的是,我希望每个用户都拥有自己的“独特”编号系统。而不是自动递增项目编号1,我做了这样的事情,以便Bob的第一个项目从#1开始,而Alice的编号也将从#1开始。房间和类别也是如此。我通过为项目,房间和类别创建“映射”表来实现这一目标。查询6个表格,有没有更好的方法来做到这一点?
下面的查询工作,但我知道它绝对可以重构。我在每个表中都有主键(在“ids”上)。
SELECT unique_item_id as item_id, item_name, category_name, item_value, room_name
FROM
users_items, users_map_item, users_room, users_map_room, users_category, users_map_category
WHERE
users_items.id = users_map_item.map_item_id AND
item_location = users_map_room.unique_room_id AND
users_map_room.map_room_id = users_room.room_id AND
users_map_room.map_user_id = 1 AND
item_category = users_map_category.unique_category_id AND
users_map_category.map_category_id = users_category.category_id AND
users_category.user_id = users_map_category.map_user_id AND
users_map_category.map_user_id = 1
ORDER BY item_name
users_items
| id | item_name | item_location |item_category |
--------------------------------------------------------
| 1 | item_a | 1 | 1 |
| 2 | item_b | 2 | 1 |
| 3 | item_c | 1 | 1 |
users_map_item
| map_item_id | map_user_id | unique_item_id |
----------------------------------------------------
| 1 | 1 | 1 |
| 2 | 1 | 2 |
| 3 | 2 | 1 |
users_rooms
| id | room_name |
----------------------
| 1 | basement |
| 2 | kitchen |
| 3 | attic |
users_map_room
| map_room_id | map_user_id | unique_room_id |
----------------------------------------------------
| 1 | 1 | 1 |
| 2 | 1 | 2 |
| 3 | 2 | 1 |
users_category
| id | room_name |
----------------------
| 1 | antiques |
| 2 | appliance |
| 3 | sporting goods |
users_map_category
| map_room_id | map_user_id | unique_category_id |
----------------------------------------------------
| 1 | 1 | 1 |
| 2 | 1 | 2 |
| 3 | 2 | 1 |
那么您可以创建一个视图并使用该视图来使用该查询。这会让你有机会稍后改进它,而不需要改变使用它的任何地方(通过视图)。这不是真正的解决方案,但希望有提示;) – Hajo 2012-04-22 16:23:35
'item_value'在你的表中无处?如果在连接表中找不到匹配的行,请声明您想要执行的操作。显示“NULL”或从结果中删除行? – 2012-04-22 16:41:05
我忽略了包含所有我需要的字段,但项目信息来自users_items表。 – luckytaxi 2012-04-22 16:42:48