繁体   English   中英

SQL 我如何根据在数组中找到的值使用准备好的语句连接两个表

[英]SQL how do I join two tables using prepared statements based on values found in an array

我有包含以下内容的表格产品:

product_id | name | category | img
1            car     toy        tcar.jpg
2            boat    toy        tboat.jpg
3            plane   actual     plane.jpg

我还有包含以下内容的表格产品:

product_id | size | price 
1            large   5
2            small   3
2            medium  4
3            small   7

最后,我有一个名为 $products_in_cart 的多维数组,其键等于 product_id。 它存储以下值:

Array ( [1] => Array ( [Quantity] => 1 [Size] => large) [2] => Array ( [Quantity] => 5 [Size] => medium ) )

我想内部加入产品和产品,然后获取在数组 $products_in_cart 中找到的产品。 (所以我将根据 product_id($products_in_cart 中的键)以及大小来获取)。 这必须使用准备好的语句来完成。

我设法使用这些语句获取在 $products_in_cart 中找到的产品:

$array_to_question_marks = implode(',', array_fill(0, count($products_in_cart), '?'));
$stmt = $pdo->prepare('SELECT * FROM products WHERE product_id IN (' . $array_to_question_marks . ')');
$stmt->execute(array_keys($products_in_cart));
$products = $stmt->fetchAll(PDO::FETCH_ASSOC);

这给出了 output:

Array ( [0] => Array ( [product_id] => 1 [name] => car [category] => toy [img] => tcar.jpg) [1] => Array ( [product_id] => 2 [name] => boat [category] => toy [img] => tboat.jpg))

然而,我想要的是得到这个 output:

Array ( [0] => Array ( [product_id] => 1 [name] => car [category] => toy [img] => tcar.jpg [size] => large [price] => 5) [1] => Array ( [product_id] => 2 [name] => boat [category] => toy [img] => tboat.jpg [size] => medium [price] => 4))

我希望我应该在内部加入产品和产品,然后选择那些 ID 和尺寸与 $products_in_cart 中的相匹配的产品。 但是我不知道如何做到这一点(准备好的陈述使我的过程变得复杂)。

对于我对问题的糟糕描述,我深表歉意,但我希望我设法做的事情的例子能说明问题,谢谢!

好吧,如果您想进行内部联接,只需...进行内部联接。 没有人说你不能在准备好的声明中做一个!

替换这一行

$stmt = $pdo->prepare('SELECT * FROM products WHERE product_id IN (' . $array_to_question_marks . ')');

有了这个(为了更清楚起见,我将它分成几行):

$stmt = $pdo->prepare('SELECT * FROM products 
            INNER JOIN product 
            ON (products.product_id = product.product_id) 
            WHERE products.product_id IN (' . $array_to_question_marks . ')');

如果您愿意,也可以使用“速记”版本:

$stmt = $pdo->prepare('SELECT * FROM products, product 
            WHERE products.product_id = product.product_id 
            AND products.product_id IN (' . $array_to_question_marks . ')');

作为旁注,使用两个相似的命名表会造成混淆。 由于“产品”表包含尺码和价格但没有产品信息,您可以将其重命名为“prices_sizes”之类的名称。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM