【问题标题】:Mysql restaurant menu [duplicate]Mysql餐厅菜单[重复]
【发布时间】:2013-12-27 21:40:35
【问题描述】:

我正在制作餐厅菜单,我想轻松地显示同一产品不同尺寸的不同价格,例如比萨饼。

由于数据库很大,我已经简化了信息,所以如果可能会马虎,请见谅。

Mysql 表

餐桌:食物

id |     type             | size    | price | category
------------------------------------------------------
 1 | all dressed          | x-small | 7,65  | pizzas
 2 | all dressed          | small   | 9,65  | pizzas
 3 | all dressed          | medium  | 11,65 | pizzas
 4 | all dressed          | large   | 18,65 | pizzas
 5 | pepperoni and cheese | x-small | 6,65  | pizzas
 6 | pepperoni and cheese | small   | 8,65  | pizzas
 7 | pepperoni and cheese | medium  | 10,65 | pizzas
 8 | pepperoni and cheese | large   | 15,65 | pizzas

id int(11)
name varchar(255)
size varchar(60)
price varchar(50)

表格:类别

id | name
---|-----------
 1 | pizzas
 2 | subs
 3 | wings

id int(11)
name varchar(255)

想要的布局结果

Pizzas

|------------------------------------------------------------------|
| Flavor                x-small      small      medium      large  |
|------------------------------------------------------------------|
| all dressed           7,65         9,65       11,65       18,65  |
|------------------------------------------------------------------|
| pepperoni and cheese  6,65         8,65       10,65       16,65  |
|------------------------------------------------------------------|

尝试过的代码

第一个循环主要是为了确保信息得到解析。

----| queries.php |------------
public function my_products()
{
    global $db;
    $query = "SELECT * FROM foods ORDER BY name, price ASC";
    return $db->select($query);
}
public function my_categories()
{
    global $db;
    $query = "SELECT * FROM categories ORDER BY name ASC";
    return $db->select($query);
}

----| page.php |---------------
<?php $products = $query->my_products(); ?>
<?php $categories = $query->my_categories(); ?>

<table>
    <?php
       foreach($categories as $category)
       {
           echo "<h3>".$category->name."<h3>";
           echo "<table>";

           foreach ( $products as $product )
           {
               if($category->id == $product->category)
               {
                   echo "<tr>";
                   echo "<td>".$product->name."</td>";
                   echo "<td>".$product->size."</td>";
                   echo "<td>".$product->price."</td>";
                   echo "</tr>";
               }
           }

           echo "</table>";
       }
    ?>
</table>

...返回...

pizzas
| ------------|---------|-------|
| all dressed | x-small | 7,65  |
| all dressed | small   | 9,65  |
| ...         |         |       |
|-------------|---------|-------|
subs

wings

现在我已经确认信息已返回,我正试图让数据库以特定顺序返回比萨饼的大小,但我不想硬编码这些值,因为尺寸因一种产品而异(例如,比萨饼是 x-small, small, medium, large,而 subs 是 6" and 12")。

我怎样才能阅读它们应该是的尺寸顺序?除了将我的字段设为ENUM 类型并遍历我的所有条目之外,还有其他方法可以遍历$product-&gt;size 并正确填写表格吗?

【问题讨论】:

  • 您要么必须将所有大小硬编码到查询中,要么编写动态 SQL。链接的问题应该有助于理解。
  • 您必须在 size 列上有一个 order 属性来指定返回数据的顺序。系统根本不知道什么是对的,你必须给它提供正确的方法。这样做的骇人听闻的方法是将不可见的 ascii 字符从低到高嵌入到大小列中,以便引擎以所需的方式对它们进行排序。更正确的方法是使用与 size 字段相关的 order 字段来指定给定产品可用尺寸的尺寸顺序。有了它,您就可以使用数据透视表进行数据透视。
  • 考虑在应用层/表示层处理数据显示问题(例如作用于有序数组的简单 PHP 循环)
  • @xQbert 您能否将您的评论复制到答案中?这是最简单也是最有效的方法。最直接的选择是为每类食物设置一个允许大小的索引。
  • @PubliDesign 根据要求。我必须承认,虽然在阅读了我的评论后,我知道我想说什么,但我印象深刻的是你明白我想说什么:D

标签: php mysql sql pivot


【解决方案1】:

您必须在 size 列上有一个 order 属性来指定返回数据的顺序。系统根本不知道什么是对的,你必须给它正确的方法。

这样做的骇人听闻的方法是将不可见的 ascii 字符从低到高嵌入到大小列中,以便引擎以所需的方式对它们进行排序。

更正确的方法是使用与尺寸字段相关的订单字段来指定给定产品的可用尺寸的尺寸顺序。有了它,您就可以使用数据透视表进行透视

【讨论】:

    【解决方案2】:

    我会强烈考虑更适当地规范化您的表结构:

    products
    
    product_id - autoincrement primary key
    name - varchar holding values like "all dressed"
    category_id - foreign key to category table
    
    product_sizes
    
    product_size_id autoincrement primary key
    product_id foreign key to products table
    product_size - varchar holding values like 'x-small', 'large', '6"', '12"'
    product_price - float
    sort_order - int holds values you can use for sorting within is product_id grouping
    
    categories
    
    category_id - autoincrement primary key
    category_name - varchar folding values like 'pizza', 'subs', etc.
    

    然后查询它们很简单:

    SELECT
      c.category_name AS category_name,
      p.product_name AS product_name,
      ps.product_size AS product_size,
      ps.product_price AS product_price
    FROM
      categories AS c
      INNER JOIN products AS p
        ON c.category_id = p.category_id
      INNER JOIN product_sizes AS ps
        ON p.product_id = ps.product_id
    ORDER BY
      c.category_name ASC,
      p.product_id ASC,
      ps.product_order ASC
    

    在 PHP 中,您只需构建一个多维数组,其中包含类别、product_id 和 product_size 维度,

    $product_array = array();
    while($row = [insert your DB fetch mechanism here]) {
        $product_array[$row->category_name][$row->product_name][$row->product_size] = $row->product_price;
    }
    

    输出您的表格可能如下所示:

    <?php
    foreach ($product_array as $category => $cat_data) {
       // output category heading
    ?>
       <h2><?php echo $category; ?></h2>
    <?php
       // start a table perhaps
       // get all sizes for this category
       // this is done in a bit of a short-cut manner and assumes that each product in the category has the same options as the first product in the category
       $size_array = array_keys($cat_data[key($cat_data)]);
    ?>
       <table>
           <tr>
               <th>Flavor<th>
    <?php
       foreach($size_array as $size) {
    ?>
               <th><?php echo $size; ?></ht>
    <?php
       }
    ?>
               <th>Price</th>
           </tr>
    <?php
        foreach ($cat_data as $prod_name => $prod_data) {
    ?>
           <tr>
               <td><?php echo $prod_name; ?></td>
           foreach($prod_data as $size => $price) {
    ?>
               <td><?php echo $price; ?></td>
    <?php
           }
    ?>
           </tr>
    <?php
        }
    ?>
        </table>
    <?php
    }
    ?>
    

    【讨论】:

      猜你喜欢
      • 2011-09-21
      • 2016-08-04
      • 1970-01-01
      • 1970-01-01
      • 2012-05-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多