将表ID存储在另一个表中以便稍后提取数据

时间:2018-02-27 15:35:32

标签: php mysql

我努力争取一个合适的头衔,但希望我把它描述得足够好。

我在表格中存储了不同的id,以便稍后显示id行的数据,并排除未选中的其他行。

我的products表看起来像这样(例如):

╔═══════╦═════╗
║ name  ║ buy ║
╠═══════╬═════╣
║ apple ║ 1,3 ║
║ fanta ║ 1,2 ║
║ candy ║ 2,3 ║
╚═══════╩═════╝

其中buy包含id表中行的shop

我的shop表看起来像这样(例如):

╔════╦══════════════════╗
║ id ║       url        ║
╠════╬══════════════════╣
║  1 ║ www.google.com   ║
║  2 ║ www.facebook.com ║
║  3 ║ www.youtube.com  ║
╚════╩══════════════════╝

我想要完成的是我的products表"了解" buy包含shop表中不同行的id,并且仅显示这些行的数据。因此appleurl1以及 3显示2

我的模态看起来像这样:

<?php

   include 'core/pdo.php'; // the database connection

   // this is to grab data for the selected products modal (title of product only)

   $id = $_GET['id'];
   $query = "SELECT * FROM product WHERE id = :id";
   $statement = $pdo->prepare($query);
   $statement->bindParam(":id", $id);
   $statement->execute();

   $row = $statement->fetch();

   $productName = $row["name"];

   // this is where i struggle

   $query2 = "SELECT * FROM products INNER JOIN shop ON products.buy = shop.ID";
   $statement2 = $pdo->prepare($query2);
   $statement2->execute();
   $result = $statement2->fetchAll();

?>

<h1 ><?php echo $productName ?></h1>

<table class="table">
   <thead>
      <tr>
         <th scope="col">Website</th>
      </tr>
   </thead>
   <tbody>
      <?php
      foreach ($result as $row) {
         echo '<tr>';
            echo '<td class="align-middle">'.$row["url"].'</td>';
         echo '</tr>';
      }
      ?>
   </tbody>
</table>

如您所见,我正在尝试使用:$query2 = "SELECT * FROM products INNER JOIN shop ON products.buy = shop.ID";

但它显示了一切。

如果是任何信息,我使用implode来分隔不同的ID。代码如下所示:

$statement->bindParam(":buy", implode(',', $_POST['selected_shops']));

感谢您的帮助!!! : - )

3 个答案:

答案 0 :(得分:3)

你的购买&#39;列可枚举?您必须将(1,3)作为字符串处理并将查询工作以便能够读取,这将比使用外键更慢地处理。

在我看来,该表结构没有规范化。 为什么不将多关系表作为:

表产品

Id   Name 
1    apple
2    fanta
3    candy

餐厅

Id   url 
1    www.google.com 
2    www.facebook.com 
3    www.youtube.com 

Table ShopProducts

Id   IdProduct  IdShop 
1    1          1
2    1          3
3    2          1
4    2          3
3    3          2
4    3          3

示例查询:

SELECT * FROM products 
         INNER JOIN ShopProducts ON ShopProducts.IdProduct = products.ID 
         WHERE IdShop IN (1,2)   

例如,将检索商店1和2中的所有商品信息。 这样,您就可以将产品放在多个商店中。您可以从ShopProducts删除ID列,并同时生成IdProduct&amp; IdShop作为复合主键和外键,使它们成为一种独特的组合。

答案 1 :(得分:1)

关于buy字段,您的计划数据库未规范化。

您应该这样做,并在此表的namebuy列上创建主键:

╔═══════╦═══╗
║ name  ║buy║
╠═══════╬═══╣
║ apple ║ 1 ║
║ apple ║ 3 ║
║ fanta ║ 1 ║
║ fanta ║ 2 ║
║ candy ║ 2 ║
║ candy ║ 3 ║
╚═══════╩═══╝

这将允许您使用SQL搜索两个表的连接,而不会对当前设计产生任何痛苦。

这不会替换products表,它是一个名为products_shop的新表。 products表只有一列,不再包含buy列。

答案 2 :(得分:1)

这个答案适用于您当前的数据库结构(而不​​是它是一种正确的方法) - 满足您的要求!

为什么不使用直接id使用in子句?

%

试一试。请注意,它不是在数据库中存储两个不同实体之间关系的适当方法。 请考虑创建一个表格,其中您将产品ID与商店ID相关联。