【问题标题】:query to sort an column containing comma separated values in mysql查询以对 mysql 中包含逗号分隔值的列进行排序
【发布时间】:2015-04-14 18:45:03
【问题描述】:

正在为想要在线销售杂货的客户创建一个电子商务项目

并且我有一个价格列,其中将包含相应数量的产品的逗号分隔价格。问题是如何按'价格从高到低''价格从低到高'功能进行排序。

这是示例表

    **id**    **Price**         **Quantity**           Name
       1          20,30,50         250mlgm,500ml,1lt     Coca-Cola
       2          40,60,70         250mlgm,500ml,1lt     Pepsi

现在的问题是,如果我想将价格列从低到高或从高到低排序,查询会是什么样子

ORDER BY Price DESC 或 ORDER BY Price ASC 在我的情况下不起作用

请指导我

我通过分解逗号并将它们保存在这样的数组中来填充选择标签中每个产品的价格和数量

 <select ><option style='font-size:1vw;' value="Select Unit" >Select Unit</option>  

  <?php
 $drq=$rows['Quantity'];
$drp=$rows['Price'];
  $degh=explode(',',$drp);
 $tryGH=explode(',',$drq);
  for($ij=0;$ij<count($tryGH);$ij++){
 echo "<option style='font-size:1vw;' value=$degh[$ij]  >$tryGH[$ij]&nbsp;-&nbsp;$degh[$ij]</option>";  
  }
  ?> </select>

结果是这样的

【问题讨论】:

  • 你不能因为值是字符串,而不是整数。您可以稍后在 PHP 中执行此操作。为什么不将价格和数量存储为单独的配对(例如,上面有 9 行)?
  • 不会发生,你需要为价格和数量制作多对多表,id 为 FK
  • 嗯.. 单个产品的不同数量的不同行将导致一个冗长的表格.. 我认为我必须删除可变数量的可变价格商品的排序功能
  • 你为什么要关心这张桌子有多大?
  • 实际上是通过分隔逗号在选择标签中填充数量和价格,以便最终用户一次可以看到产品的数量和相应的价格。我以为那会很方便。是否有任何简单的解决方案来执行相同的操作?

标签: php mysql sorting


【解决方案1】:

您可以通过几种方式安排您的数据库。一种方法是

**id**    **Price**         **Quantity**           Name
       1          20         250mlgm            Coca-Cola
       2          30         500ml              Coca-Cola 
       3          50         1lt                Coca-Cola

然后在您的代码中,您可以输出到客户端以选择值

<select name="unit" >
    <option style='font-size:1vw;' value="Select Unit" >Select Unit</option>
<?php
$query = 'select Quantity, Price, Id, Name from Products ORDER BY name asc, Price DESC';
//execute the query, I don't know your driver
while($row = FETCH_FROM_YOUR_DRIVER) {
    $quantitY = $row['Quantity'];
    $price = $row['Price'];
    $id = $row['Id'];
    $company = $row['Name'];
    echo "<option style='font-size:1vw;' value='$id'>$quantity&nbsp;-&nbsp;$price&nbsp;$company</option>";  
}?>
</select>

然后您应该获取他们选择的 ID 并从您的数据库中查询价格。在您当前的代码中,我认为您是直接从客户那里获取价格。然而,客户可以操纵它并向您发送 0 的价格。

更新:

<style type="text/css">
.container {
    display:block;
    float:left;
    margin:15px;
}
</style>
<?php
$query = 'select Quantity, Price, Id, Name from Products ORDER BY name asc, Price DESC';
//execute the query, I don't know your driver
$count = 0;
while($row = FETCH_FROM_YOUR_DRIVER /*again not sure of your driver*/) {
    $products[$count]['id'] = $row['Id'];
    $products[$count]['price'] = $row['Price'];
    $products[$count]['quantity'] = $row['Quantity'];
    $products[$count]['name'] = $row['Name'];
    $count++;
}
/* Can be removed, I haven't set up a DB so this is how I test
$products = array(array('id' => 2, 'price' => 30, 'quantity' => '500ml', 'name' => 'Coca-Cola'),
            array('id' => 3, 'price' => 50, 'quantity' => '1lt', 'name' => 'Coca-Cola'),
            array('id' => 4, 'price' => 20, 'quantity' => '25mlgm', 'name' => 'Pepsi'),
            array('id' => 5, 'price' => 30, 'quantity' => '500ml', 'name' => 'Pepsi'),
            array('id' => 6, 'price' => 50, 'quantity' => '1lt', 'name' => 'Pepsi'));
*/
$sameproduct = false;
foreach($products as $key => $product) { 
    if ($key == 0 || $products[($key - 1)]['name'] != $product['name']) { 
        if ($key != 0) { ?> 
            </select>
            </div>
        <?php } ?>
    <div class="container">
        <h4><?php echo $product['name'];?></h4>
        <img src="/images/LOCATION/<?php echo strtolower(str_replace(array(' ', '-'), '_', $product['name']));?>.jpg" /> <br />
    <select name="unit" >
    <?php } ?>
        <option style='font-size:1vw;' value='<?php echo $product['id'];?>'><?php echo $product['quantity'];?> - <?php echo $product['price'];?></option>
<?php } ?>

这要求您的名称保持一致,并且还假定数据库中的名称与文件系统中的图像名称相匹配。它将名称中的空格和破折号替换为下划线。

【讨论】:

  • 好的,但是我将如何查询以在一个地方填充同一商品的数量和价格。根据您的回答,我认为用户只会得到一个数量和价格可供选择..如何防止这种情况发生?扩展一个表是可以的,但让最终用户感到困惑对我来说似乎并不好。你对此有何建议?顺便说一句 FETCH_FROM_DRIVER 是什么 .. 我对此一无所知,但我会进行交叉检查以验证价格和数量
  • 上面的更新怎么样,有意义吗? “FETCH_FROM_DRIVER”意味着我不知道您使用的是什么驱动程序,但您需要通过与您正在使用的任何驱动程序关联的函数来获取数据。你还没有发布你的完整代码,所以我不知道你是如何访问数据库的。
  • 但是,在选择标签中填充价格和数量时,我如何按价格对产品进行排序,并且会有多个具有不同数量和各自价格的产品
  • 这应该首先按名称排序,以便您所有的可乐产品将放在一起然后按价格。你能举一个你想要输出的例子吗?如果您只想按价格计算,请删除name asc,
  • 已编辑我的问题并添加了快照,请查看
【解决方案2】:

尝试使用convert将字符串转换为数字,然后排序

SELECT id, Price, Quantity FROM Products ORDER BY CONVERT(Price, UNSIGNED INTEGER) ASC

【讨论】:

  • 这将如何工作?那里有多个值。
  • 我在我的测试项目中尝试过,它成功了。根据数量输入价格。因此,如果我可以按价格的第一个值对其进行排序,那么结果应该是正确的。 CONVERT 将字符串转换为数字,因此 '20,30,50' 被转换为 20,并在此基础上进行排序。
  • 是的,203050 有 3 个价格,3 个数量。
  • 是的,我知道这一点。但是,正如我之前所说,价格是根据数量输入的。因此,产品 1 的价格为 25 克 20,50 克 30,依此类推。这意味着,产品 1、2 和 3 对于 25 克的数量分别具有 20、40 和 5 的价格。如果我在这里假设 25gm 作为一个单位并对 - 20、40 和 5 进行排序 - 那么这应该会给我正确的结果
  • 如果产品只有1gm数量或500gm数量怎么办?您将比较25gm 价格与1gm 价格或500gm 价格。此外,如果大量产品(50gm100gm)由于某种原因更便宜怎么办?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-01
  • 1970-01-01
  • 2011-08-02
  • 2022-06-10
相关资源
最近更新 更多