【发布时间】:2020-04-18 05:19:19
【问题描述】:
希望有人知道查询/处理这些标题的好方法...
例如,如果您有一个食谱,它可能如下所示:(带有标题和成分)
沙拉
- 新鲜生菜
- 切碎的胡萝卜
- 新鲜草莓
着装
- 醋
- 糖
- 肉桂
装饰
- 杏仁片
在 MySQL 数据库中,我将把这些数据存储在 recipe 表中。所以这个食谱可能看起来像这样:
+----+---------------+-----------------+--------------------+---------------------+-----------+---------+-----------+---------+-----------+---------+
| id | ingredient_1 | ingredient_2 | ingredient_3 | ingredient_4 etc... | heading_a | h_a_pos | heading_b | h_b_pos | heading_c | h_c_pos |
+----+---------------+-----------------+--------------------+---------------------+-----------+---------+-----------+---------+-----------+---------+
| 1 | Fresh Lettuce | Chopped carrots | Fresh Strawberries | Vinegar | Salad | 1 | Dressing | 4 | Garnish | 7 |
+----+---------------+-----------------+--------------------+---------------------+-----------+---------+-----------+---------+-----------+---------+
配料全部存放在一起,标题存放在一起。 (不同的菜谱需要不同的标题和与配料相关的不同位置。)这里的标题位置(h_a_pos等)表示配料#以在前面列出标题。
当涉及到查询这个来显示它时,如果我运行一个简单的 SQL 查询:
SELECT * FROM recipes WHERE id = 1;
这只会返回给我所有内容的列表。这是一个 SQL Fiddle:http://sqlfiddle.com/#!9/942d8a3/1/0
使用 PHP,我可以获取结果并将其放入数组中。而且我确信有某种方法可以对它们进行排序,但我正在画一个空白......
$response = []; // blank array
$sql_retrieve = $con->prepare("SELECT * FROM recipes WHERE id = 1");
$sql_retrieve->execute();
$result = $sql_retrieve->get_result();
if($result->num_rows>0){
while($row=$result->fetch_assoc()){
$response[] = $row;
} // end of while
} // end of num_rows
print_r($response); // display response pre-sorting
// sort array -- not working
usort($response, function($a, $b) {
return $a['h_a_pos'] <=> $b['h_b_pos'];
});
// would need something to order it in relation to the ingredients...
echo '<br /><br />';
print_r($response); // display response post-sorting
我可以更改数据库结构,但如果可能的话,我更愿意将其保留在一个表中。 (我知道有些成分可能没有标准化,但我也没有在这个例子中列出数量等。)
有人对如何存储标题有任何想法吗?我基本上只需要知道它应该是一个标题(因此可以适当地格式化),文本应该是什么,以及在哪个成分编号之前显示它。 (我永远不会查询标题,所以如果这可以更好地序列化存储,那可能是一个选择......)
【问题讨论】:
-
这是一个糟糕的数据库结构。在继续之前了解标准化。
-
例如,如果某些食谱没有第三种成分,则该列中的值为空。您最好创建一个 1:n 关系,例如1 个配方有很多成分或 1 个配方有很多类别,而 1 个类别有很多成分。类别是标签沙拉,装饰等
-
因此,如果我有另一个表格用于成分,另一个用于链接它们的表格(recipe_ingredients)和另一个用于配方标题的表格;关于如何以正确的顺序排列标题,这仍然没有让我更进一步......
-
使用
GROUP_CONCAT()而不是旋转将多种成分放入多个列中。
标签: php mysql database-design