我有两个名为mg_product
和mg_product_user_property
的表。
在mg_product
中有3列:id
,title
,price
为
在mg_product_user_property
表中product_id
与id
表中的mg_product
列对应。
所以我的目标是获得" 15"的property_id
的值,在上图中将是" Mediatek"。
这是我的SQL:
$sql = "SELECT *
FROM mg_product AS products
INNER JOIN mg_product_user_property AS properties
ON products.id = properties.product_id
WHERE title LIKE '%$search%')";`
PHP:
$resultSet = DB::query($sql);
if ($resultSet->num_rows > 0) {
while ($rows = $resultSet->fetch_assoc()) {
$title = $rows['title'];
$price = $rows['price'];
}
} else {
$output = "No results";
}
现在我需要为php变量分配property_id=15
的值,这样我就可以打印" Mediatek"在我的网站上。我怎样才能做到这一点?抱歉我的英文。
答案 0 :(得分:1)
你非常接近你想要的东西,但是有些事情要么是混乱,要么是不必要的。所以,由于人们可以采用不同的方式,我只会提供一个非常剥离的例子(我特意留下一堆代码)。
您可能不希望在初始搜索中像这样进行JOIN,因为对于每个属性,它也将返回另一个相同的产品。因此,循环使用将产生数十种相同的产品。
但是,如果_ALL_YOU_WANT_要显示产品标题,价格和属性15 ......您可以通过更简单的查询减少一些头条:
SELECT p.title, p.price, pr.value
FROM mg_product AS p
LEFT JOIN mg_product_user_property AS pr
ON p.id = pr.product_id AND pr.property_id = 15
WHERE p.title LIKE '%$search%'
LEFT JOIN表示如果该属性不存在,它仍将返回该产品。但是有一个空的属性值。并且这不应该为表中的每个其他属性返回数十个相同的产品。
-
使用您已经拥有的SQL查询(以及它将返回的相同产品的数十个结果),你可以去做其他方式,你可以像这样改变你的php循环:
$found_products = array();
while ($row = $resultSet->fetch_assoc()) {
if ($row['property_id'] == 15) {
$found_products[$row['product_id']] = array(
'title' => $row['title'],
'price' => $row['price'],
'prop' => $row['value']
);
}
}
// now you have a clean array of found products that have the property
-
此外,我不得不指出你应该在这里使用预备语句,直接将$ search插入代码中。但向您展示如何做到这一点超出了这个问题/答案的范围。