【问题标题】:Calling SQL foreign key data with PHP用 PHP 调用 SQL 外键数据
【发布时间】:2012-12-29 00:54:28
【问题描述】:

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

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

如果在表中有

vneck 尺寸,

汤匙领尺寸

我将它设置为 v 领只有 s、m、l、1x,而汤匙领有 xs、s、m、l、1x、2x、3x。如何编码 PHP 以识别我在每一行中为该列逻辑设置的差异?

【问题讨论】:

    标签: php sql foreign-keys relationships


    【解决方案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
    

    【讨论】:

      【解决方案2】:

      具有如下表结构:

      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`;
      

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

      【讨论】:

      • 我知道这是如何工作的。我复制并粘贴了您提供的脚本,在最后一个脚本中出现此错误(“on 子句”中的未知列“shirt_size.id”)我查看了代码并试图找出自己出了什么问题但找不到它。这发生在你给我的两个 SELECT 选项上,所以我知道。我会继续查看它,看看我是否能找到问题所在,但如果你能找到它,请分享,我认为这会奏效。 :)
      • 我想我想通了!!!!...不应该是 (shirt_size.size_id) 吗?而不是 (shirt_size.id)?我会试试的
      • sizeId 工作。但弹出的表格中没有结果。
      • @DaMightyOptiq 对不起,我犯了一些错误:表 shirt_size 中的最后一个外键指向表 shirt 而不是 size 并且在查询中,我加入了在shirt_size.id 上,应该是shirt_size.sizeId。在第一个查询中,我忘记添加 GROUP BY 子句。我现在已经解决了这一切。所以,请删除旧的三个表,并尝试重新创建它们并再次插入数据。它现在应该可以工作了。
      • 啊,是的,那是因为两个选定的列都命名为name。我现在给它们起了独特的名字:shirtNamesizeName。你现在应该很好了。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-07
      • 2021-09-15
      • 1970-01-01
      • 2017-04-11
      • 1970-01-01
      相关资源
      最近更新 更多