我正在获取列内容存储为3,2的内容,然后我使用explode函数将它们分开。然后,分隔的值用于查询另一个表以引入名称。接下来我想破坏汉堡,薯条等结果。但结果并没有用逗号分隔,而是像汉堡包......这就是我所做的:
$sql = "SELECT items FROM orders";
$result = mysqli_query($connection, $sql);
$array = mysqli_fetch_assoc($result);
$exploded = explode(",", $array['items']);
foreach ($exploded as $row){
$query = "SELECT food_name FROM foodlist WHERE food_id = $row";
$res = mysqli_query($connection, $query);
$arr = mysqli_fetch_assoc($res);
$imploded = implode(", ", $arr);
echo $imploded;
}
答案 0 :(得分:6)
因为每个$arr
只包含一个成分,所以你实际上implode()
只有一个元素,回应它,然后回应其他没有被任何东西分开的成分,所以它们一起显示出来。
您可以将它们添加到数组中然后内爆它们:
$sql = "SELECT items FROM orders";
$result = mysqli_query($connection, $sql);
$array = mysqli_fetch_assoc($result);
$exploded = explode(",", $array['items']);
$ingredients = [];
foreach ($exploded as $row){
$query = "SELECT food_name FROM foodlist WHERE food_id = $row";
$res = mysqli_query($connection, $query);
$arr = mysqli_fetch_assoc($res);
$ingredients[] = $arr["food_name"];
}
echo implode(", ", $ingredients);
PRO TIP ,将您的字段用数据库中的逗号分隔是一个坏主意。您应该normalize该字段,有另一个名为ingredients
的表和一个名为order_ingredient
的数据透视表,其中包含特定订单所具有的每种成分,然后您可以通过ID简单地JOIN
成分并立即获取所有内容,而不是执行N+1 queries,这会扼杀 fast 的性能。
结构如下所示:
查询类似
SELECT ingredient FROM orders o JOIN order_ingredient oi ON oi.order_id = o.id JOIN ingredients i ON oi.ingredient_id = i.id
只需一次查询即可返回所有成分。
答案 1 :(得分:3)
我看到你已经接受了答案。
如果您希望大幅减少正在执行的查询数量,可以使用以下单个查询来获取所有订单的逗号分隔食品项目列表。
SELECT o.id, GROUP_CONCAT(f.name SEPARATOR ', ') AS food
FROM orders o
INNER JOIN food f ON FIND_IN_SET(f.id, o.items) > 0
GROUP BY o.id
这是一个用来演示的SQL小提琴:http://sqlfiddle.com/#!9/b0004c/2
但正确的解决方案是规范化数据库结构。