-2

我有一个包含 2 个表的数据库,如下所示:

类别

Name        |    Items
---------------------------------
At Home     |    3,4,8,9
At Office   |    10,3,2,1

项目

Name        |    id
--------------------------------
Fix Car     |    3
Mow Lawn    |    4
Garbage     |    8
Laundry     |    9
Desk Clean  |    10

在类别表中,逗号分隔的数字表示按 id 排列的项目列表。

我将如何执行 SQL Select 来选择特定类别中的所有项目(例如“在家”),然后按照与项目列相同的顺序对它们进行排序。

数据库已被简化,希望使问题更容易理解。

此外,如果您能想出一种更好的方法来为这种类型的应用程序组织数据库,那就太好了。

定制订单对该项目至关重要

4

2 回答 2

3

如果可能,创建第三个表来规范您的数据库,或查看下面的编辑:-)

CATEGORIES

Name        |    id
---------------------------------
At Home     |    1
At Office   |    2


ITEMS

Name        |    id
--------------------------------
Fix Car     |    3
Mow Lawn    |    4
Garbage     |    8
Laundry     |    9
Desk Clean  |    10


LINKS

cat_id     |   item_id
--------------------------------
1          |   3
1          |   4
1          |   8
1          |   9
2          |   10
2 etc.

然后去:

SELECT items.name 
FROM items 
LEFT JOIN links ON items.id = links.item_id
WHERE items.cat_id = 1
ORDER BY items.id

我刚刚意识到我的操作是假设 eachitems可以是多个categories. 如果您想要 1 个项目 --> 1 个类别,则不需要第三个表,只需在 中添加一个字段items,然后再添加一个用于自定义排序:

项目

Name        |    id   | cat_id |  order
-----------------------------------------
Fix Car     |    3    |   1    |   1
Mow Lawn    |    4    |   2    |   1
Kill Cat    |    9    |   1    |   2

SELECT name 
FROM items 
WHERE cat_id = 1
ORDER BY order
于 2013-02-19T02:17:03.360 回答
0

采用FIND_IN_SET

SELECT  a.name, b.Name itemName
FROM    categories a
        INNER JOIN items b
            ON FIND_IN_SET(b.id, a.items) > 0

更好地规范化表以获得更好的性能。这样做的一个缺点是很难满足您的要求,例如。..按照与项目列相同的顺序对它们进行排序

于 2013-02-19T02:02:12.937 回答