我必须以如下所示的方式创建一个表。我们可以这样创作吗?(如是)
表名:示例
product_id| product_name| category |
1 | Sample1 | 1|2|3 |
2 | sample2 | 4|5|6 |
其中类别字段包含多个值。
以及我们如何在表格的哪一行搜索类别 4。
您不能创建嵌套表。而你的想法并不是这样设计桌子的好主意。您应该有两个表(如果是类别,则恰好三个包含描述)。一个是用于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;
假设这些是 形式的字符串<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 |
产品和类别之间似乎存在一对多的关系,因此您应该将类别详细信息标准化为不同的表,如下所示:
那么您的 product_categories 表将是
product_id | category_id
1 | 1
1 | 2
1 | 3
2 | 4
2 | 5
2 | 6
然后一个简单的选择语句将产品表与 product_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
您需要另一个表来表示多对多关系。您不应将多个值插入一列。
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;
是的,您可以,实际上我们通过将“类别”(例如)设为 BLOB 来做到这一点,从而允许在一行上存储非常大的数据子集。这允许一个连接和一个查询,这是更加优化的。
那么处理它的唯一方法是在“客户端”上实际这样做。如果字段中的数据太多,您可能不想使用 LIKE。
我认为您应该创建两个表;
表一
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 |