3

我必须以如下所示的方式创建一个表。我们可以这样创作吗?(如是)

表名:示例

product_id|   product_name| category   |
    1     |   Sample1     |  1|2|3     |
    2     |   sample2     |  4|5|6     |

其中类别字段包含多个值。

以及我们如何在表格的哪一行搜索类别 4。

4

7 回答 7

7

您不能创建嵌套表。而你的想法并不是这样设计桌子的好主意。您应该有两个表(如果是类别,则恰好三个包含描述)。一个是用于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;
于 2012-11-21T06:46:19.160 回答
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       |
于 2012-11-21T06:38:38.700 回答
0

产品和类别之间似乎存在一对多的关系,因此您应该将类​​别详细信息标准化为不同的表,如下所示:

  • 产品:product_id、product_name。
  • product_categories: product_id, category_id

那么您的 product_categories 表将是

product_id | category_id
         1 | 1
         1 | 2
         1 | 3
         2 | 4
         2 | 5
         2 | 6

然后一个简单的选择语句将产品表与 product_categories 表连接起来,将为您提供给定类别中的所有产品。

于 2012-11-21T06:39:54.417 回答
0

为类别制作一个单独的表格:

表类别

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
于 2012-11-21T06:41:11.483 回答
-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;
于 2012-11-21T06:39:34.943 回答
-1

是的,您可以,实际上我们通过将“类别”(例如)设为 BLOB 来做到这一点,从而允许在一行上存储非常大的数据子集。这允许一个连接和一个查询,这是更加优化的。

那么处理它的唯一方法是在“客户端”上实际这样做。如果字段中的数据太多,您可能不想使用 LIKE。

于 2012-11-21T06:40:42.353 回答
-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     |
于 2012-11-21T06:40:54.083 回答