3

我需要更好地掌握操作和使用我需要制作的 SQL 表的过程,这样我才能继续弄清楚我应该如何制作它们并构造它们以使其工作。

如果我有一个衬衫表和另一个尺码表,并且我在衬衫表上使用外键链接到尺码表以表示该列的多个选项。我只需要在 PHP 编码中调用衬衫表吗?如果是这样,我如何告诉 PHP 收集尺寸表上每一行可用的任何选项?

如果在表中有

颈围尺寸,

汤匙领尺寸

我将它设置为 vnecks 只有 s,m,l,1x 并且勺形颈有 xs,s,m,l,1x,2x,3x。如何对 PHP 进行编码以识别我在每一行中为该列逻辑设置的差异?

4

2 回答 2

4

听起来您实际上需要至少三张表,一张用于衬衫,一张用于尺码,一张用于将衬衫与尺码相关联。您可以通过多种方式使用 PHP 来查询数据,但很可能您只想使用 JOIN 来同时从所有表中获取数据。

所以也许是这样的:

shirts table:
shirt_id (auto-incrementing primary key)
...other shirt-related fields

sizes table:
size_id (auto-incrementing primary key)
size_value (i.e. S, M, L)
...other size-related fields

shirt_sizes table:
shirt_id (foreign key to shirts table)
size_id (foreign key to sizes table)
(you have compound primary key across these two fields)

你会像这样查询它

SELECT * (or whatever fields you need)
FROM shirts
INNER JOIN shirt_sizes ON shirts.shirt_id = shirt_sizes.shirt_id
INNER JOIN size ON shirt_sizes.size_id = sizes.size_id
于 2012-12-29T01:16:47.410 回答
3

具有以下表结构:

CREATE TABLE `shirt` (
    `id` INTEGER NOT NULL,
    `name` VARCHAR(32),
    PRIMARY KEY( `id` )
);

CREATE TABLE `size` (
    `id` INTEGER NOT NULL,
    `name` VARCHAR(4),
    PRIMARY KEY( `id` )
);

CREATE TABLE `shirt_size` (
    `shirtId` INTEGER NOT NULL,
    `sizeId` INTEGER NOT NULL,
    PRIMARY KEY( `shirtId`, `sizeId` ),
    FOREIGN KEY( `shirtId` ) REFERENCES `shirt`( `id` ),
    FOREIGN KEY( `sizeId` ) REFERENCES `size`( `id` )
);

而这个数据:

INSERT INTO
    `shirt` ( `id`, `name` )
VALUES
    ( 1, "vneck" ),
    ( 2, "scoop neck" );

INSERT INTO
    `size` ( `id`, `name` )
VALUES
    ( 1, "xs" ), ( 2, "s" ), ( 3, "m" ),
    ( 4, "l" ), ( 5, "1x" ), ( 6, "2x" ), ( 7, "3x" );

INSERT INTO
    `shirt_size` ( `shirtId`, `sizeId` )
VALUES
    ( 1, 2 ), ( 1, 3 ), ( 1, 4 ), ( 1, 5 ),
    ( 2, 1 ), ( 2, 2 ), ( 2, 3 ), ( 2, 4 ), ( 2, 5 ), ( 2, 6 ), ( 2, 7 );

在 MySQL 中,你可以这样做:

SELECT
    `shirt`.`id`,
    `shirt`.`name`,
    GROUP_CONCAT( `size`.`name` ) as `sizes`
FROM
    `shirt`
JOIN
    `shirt_size`
    ON `shirt_size`.`shirtId` = `shirt`.`id`
JOIN
    `size`
    ON `size`.`id` = `shirt_size`.`sizeId`
GROUP BY `shirt`.`id`;

这将导致类似:

+----+------------+-------------------+
| id | name       | sizes             |
+----+------------+-------------------+
|  1 | vneck      | s,m,l,1x          |
+----+------------+-------------------+
|  2 | snoop neck | xs,s,m,l,1x,2x,3x |
+----+------------+-------------------+

不确定其他RDBMS是否具有类似于 MySQL 的聚合函数GROUP_CONCAT()。如果没有,那么使用类似的东西:

SELECT
    `shirt`.`id`,
    `shirt`.`name` as `shirtName`,
    `size`.`name` as `sizeName`
FROM
    `shirt`
JOIN
    `shirt_size`
    ON `shirt_size`.`shirtId` = `shirt`.`id`
JOIN
    `size`
    ON `size`.`id` = `shirt_size`.`sizeId`;

这将为您提供每种尺寸的多行,每件衬衫。

于 2012-12-29T01:24:14.260 回答