用于从引用的表

时间:2017-12-08 15:11:44

标签: php mysql sql

我有两个名为mg_productmg_product_user_property的表。 在mg_product中有3列:idtitleprice

enter image description here

mg_product_user_property表中product_idid表中的mg_product列对应。

enter image description here

所以我的目标是获得" 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"在我的网站上。我怎样才能做到这一点?抱歉我的英文。

1 个答案:

答案 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插入代码中。但向您展示如何做到这一点超出了这个问题/答案的范围。