以PHP / MySQL的顺序显示以逗号分隔的数据库ID列表

时间:2013-02-19 01:59:40

标签: php mysql

我有一个包含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(例如“在家”),然后按照与项目列相同的顺序对它们进行排序。

数据库已经过简化,希望能让问题更容易理解。

另外,如果你能想出一种更好的方法来组织这类应用程序的数据库,那将很有用。

自定义订单对于此项目至关重要

2 个答案:

答案 0 :(得分:3)

如果可能,请创建第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

我刚刚意识到我的运作假设每itemscategories都可以。如果你想要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

答案 1 :(得分: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

更好地规范化表格以获得更好的性能。这样做的一个缺点是难以达到您的要求,例如。 ..按照与项目列

相同的顺序对它们进行排序