我必须以下面显示的方式创建一个表。我们可以用这种方式创造吗? (如果是)
Table_name:示例
product_id| product_name| category |
1 | Sample1 | 1|2|3 |
2 | sample2 | 4|5|6 |
其中包含多个值的类别归档。
&安培;我们如何搜索类别4来自表格的哪一行。
答案 0 :(得分:8)
您无法创建嵌套表。你想到的东西并不是设计这样的表格的好主意。您应该有两个表(正好三个表,如果类别,则包含描述)。一个用于product
,第二个表包含每个产品的类别。示例设计看起来像这样,
CREATE TABLE Product
(
ProductID INT PRIMARY KEY,
ProductName VARCHAR(50) UNIQUE
);
CREATE TABLE Category
(
CategoryID INT PRIMARY KEY,
CategoryName VARCHAR(50) UNIQUE
);
CREATE TABLE Product_Category
(
RecordD INT AUTO_INCREMENT PRIMARY KEY,
CategoryID INT,
ProductID INT,
CONSTRAINT tb_uq UNIQUE(CategoryID, ProductID)
);
和填充样本记录
INSERT Category VALUES (1, 'Fruit');
INSERT Category VALUES (2, 'Vegetable');
INSERT Product VALUES (1, 'Apple');
INSERT Product VALUES (2, 'Banana');
INSERT Product VALUES (3, 'Cabbage');
INSERT Product VALUES (4, 'Squash');
INSERT Product VALUES (5, 'Tomato');
INSERT Product_Category (CategoryID, ProductID) VALUES (1,1);
INSERT Product_Category (CategoryID, ProductID) VALUES (1,2);
INSERT Product_Category (CategoryID, ProductID) VALUES (2,3);
INSERT Product_Category (CategoryID, ProductID) VALUES (2,4);
INSERT Product_Category (CategoryID, ProductID) VALUES (1,5);
INSERT Product_Category (CategoryID, ProductID) VALUES (2,5);
示例查询
-- NORMAL QUERY
SELECT a.ProductName, c.CategoryName
FROM Product a
INNER JOIN Product_category b
ON a.ProductID = b.ProductID
INNER JOIN Category c
ON b.CategoryID = c.CategoryID
ORDER BY ProductName;
-- If you want catgoryName to be comma separated
SELECT a.ProductName, GROUP_CONCAT(c.CategoryName) CategoryList
FROM Product a
INNER JOIN Product_category b
ON a.ProductID = b.ProductID
INNER JOIN Category c
ON b.CategoryID = c.CategoryID
GROUP BY ProductName
ORDER BY ProductName;
答案 1 :(得分:0)
假设这些字符串是<item>|<item>|<item>
形式的字符串,您可以,但最好为每个类别指定与product_id
和product_name
相关的行。通过这种方式,您可以获得更好的性能并拥有更“自然”的结构,这样您就不必进行如下查询:
SELECT *
FROM Sample
WHERE category LIKE '%4|%' OR category LIKE '%|4|%' or category LIKE '%|4%'
以便检索数据。稍微好一点的解决方案是用管道包围所有字段 - 如果你有能力事先修改这些字符串,以这种方式创建字段将处理4
出现在中间或开头的情况(例如,|4|5|6|
可以与|3|4|5
)相同的方式进行查询。
更自然的结构是:
product_id| product_name| category |
1 | Sample1 | 1 |
1 | Sample1 | 2 |
1 | Sample1 | 3 |
2 | sample2 | 4 |
2 | sample2 | 5 |
2 | sample2 | 6 |
答案 2 :(得分:0)
产品和类别之间似乎存在一对多的关系,因此您应该将类别详细信息规范化为不同的表格,如下所示:
然后你的product_categories表将是
product_id | category_id
1 | 1
1 | 2
1 | 3
2 | 4
2 | 5
2 | 6
然后,一个简单的选择语句使用product_categories表连接产品表将为您提供给定类别中的所有产品。
答案 3 :(得分:0)
为类别单独制作表格:
table_categories
product_id| category |
1 | 1 |
1 | 2 |
1 | 3 |
2 | 4 |
2 | 5 |
2 | 6 |
然后你可以像这样搜索:
SELECT p.product_id, p.product_name
FROM table_products p JOIN table_categories c
ON p.product_id = c.product_id
WHERE c.category = 4
答案 4 :(得分:-1)
您需要另一个表来表示多对多关系。您不应该在一列中插入多个值。
CREATE TABLE products (product_id, product_name)
CREATE TABLE product_category (product_id, category_id)
INSERT INTO products (product_id, product_name) VALUES (1, 'Sample1');
INSERT INTO products (product_id, product_name) VALUES (2, 'Sample2');
INSERT INTO product_category (product_id, category_id) VALUES (1, 1);
INSERT INTO product_category (product_id, category_id) VALUES (1, 2);
INSERT INTO product_category (product_id, category_id) VALUES (1, 3);
INSERT INTO product_category (product_id, category_id) VALUES (2, 4);
INSERT INTO product_category (product_id, category_id) VALUES (2, 5);
INSERT INTO product_category (product_id, category_id) VALUES (2, 6);
检索第4类中的所有产品:
SELECT
products.*
FROM
products
INNER JOIN
product_category
ON
products.product_id = product_category.product_id
WHERE
product_category.category_id = 4;
答案 5 :(得分:-1)
是的,你可以,事实上我们通过将'category'(作为例子)设为BLOB来实现这一点,从而允许在一行上存储非常大的数据子集。这允许单个连接和一个查询,这更加优化。
然后处理它的唯一方法是在“客户端”实际执行此操作。 如果字段中的数据变得太多,您可能不想使用LIKE。
答案 6 :(得分:-1)
我认为你应该创建两个表;
表一
product_id| product_name|
1 | Sample1 |
2 | sample2 |
表二
category_id| product_id| category |
1 | 1 | 1 |
2 | 1 | 2 |
3 | 1 | 3 |
4 | 2 | 4 |
5 | 2 | 5 |
6 | 2 | 6 |