我努力争取一个合适的头衔,但希望我把它描述得足够好。
我在表格中存储了不同的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,并且仅显示这些行的数据。因此apple
会url
和1
以及 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']));
感谢您的帮助!!! : - )
答案 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
字段,您的计划数据库未规范化。
您应该这样做,并在此表的name
和buy
列上创建主键:
╔═══════╦═══╗
║ 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相关联。