在一列中添加多个值

时间:2012-11-21 06:35:38

标签: mysql sql

我必须以下面显示的方式创建一个表。我们可以用这种方式创造吗? (如果是)

Table_name:示例

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

其中包含多个值的类别归档。

&安培;我们如何搜索类别4来自表格的哪一行。

7 个答案:

答案 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_idproduct_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_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表连接产品表将为您提供给定类别中的所有产品。

答案 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     |