3

作成する必要のあるSQLテーブルを操作および利用するプロセスをよりよく理解して、それらをどのように作成し、機能するように構造化するかを正確に理解し続ける必要があります。

シャツ用のテーブルとサイズ用の別のテーブルがあり、シャツテーブルで外部キーを使用してサイズテーブルにリンクし、その列の複数のオプションを表す場合。PHPコーディングでシャツテーブルを呼び出すだけで済みますか?もしそうなら、サイズテーブルの各行で利用可能なオプションを収集するようにPHPに指示するにはどうすればよいですか?

テーブルにある場合

vneckサイズ、

スクープネックのサイズ

そして、私はそれを、vnecksがs、m、l、1xだけを持ち、スクープネックがxs、s、m、l、1x、2x、3xを持っているところに設定しました。その列の各行に論理的に設定した違いを認識するようにPHPをコーディングするにはどうすればよいですか?

4

2 に答える 2

4

実際には、少なくとも3つのテーブルが必要なようです。1つはシャツ用、もう1つはサイズ用、もう1つはシャツをサイズに関連付けるためのものです。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 に答える