mysql - 如何从 MySQL 中的比较和空检查指定 ORDER BY?

标签 mysql sql select sql-order-by coalesce

我有两个表 feed_old(默认数据)和 feed_new(新数据),其中 cron 作业将每天运行,并仅使用当前信息更新 feed_new 表
定时任务

$url = "localhost/test.xml";
$xml = simplexml_load_file($url);

$this->db->query("TRUNCATE TABLE feed_new");

$date = date('Y-m-d H:i:s');

foreach($xml->Product as $item)
{
  $data = array(
    'product_code'    => $item->ProductCode,
    'name'            => $item->Name,
    'price'           => $item->RetailCurrentPrice,
    'stock'           => (int)$item->Stock,
    'manufacture'           => '1',
    'date_updated'      => $date
  );

  $update_status = $this->model_price->check_price($data);
}
模型
public function check_price($data)
{
  if($data) {
    $insert = $this->db->insert('feed_new', $data);
    return ($insert == true) ? true : false;
  }
}
从这里开始一切正常
当我比较 feed_new 与 feed_old 并获得任何更改并显示所有记录时,问题就来了
在比较 feed_new 与 feed_old 之后,我想从两个表中提取所有记录并按级别对它们进行排序
级别 1 - 如果产品有不同的价格 feed_new.price <> feed_old.price
级别 2 - 如果 feed_old 中的产品在 feed_new 中不存在(这意味着不再支持产品)
级别 3 - 如果 feed_new 中的产品在 feed_old 中不存在(这意味着产品是新的)
第 4 级 - 其余结果
比较查询
SELECT fn.name AS name_new, fo.date_updated, fo.id, fo.name,fo.price,fo.product_code, fn.product_code AS product_code_new, fo.stock, fn.price AS price_new, fn.stock AS stock_new, fn.date_updated AS date_updated_new 
FROM feed_old fo 
LEFT JOIN feed_new fn ON fo.product_code = fn.product_code 

UNION ALL 

SELECT fn.name AS name_new, fo.date_updated, fo.id, fo.name,fo.price,fo.product_code, fn.product_code AS product_code_new, fo.stock, fn.price AS price_new, fn.stock AS stock_new, fn.date_updated AS date_updated_new 
FROM feed_old fo 
RIGHT JOIN feed_new fn ON fn.product_code = fo.product_code 


WHERE fo.product_code IS NULL OR fn.name IS NULL ORDER BY COALESCE(price <> price_new, name_new is NULL, product_code IS NULL) DESC
问题是级别 - 3 总是显示在最后一条记录我的意思是在级别 - 4 之后
在我下面的工作示例中,您可以看到 name_new -> test3 在表的底部,什么时候应该在第三个位置
我如何按以上级别订购它们
Working Example

最佳答案

COALESCE 似乎不是这个排序最合适的函数,因为它只返回第一个非 NULL值,这在操作数可能是 NULL 的情况下进行比较时不直观.
建议使用 CASE 取而代之的是一个虚拟整数值作为级别 - 像这样:

ORDER BY CASE WHEN price_new IS NOT NULL AND price_new <> price THEN 1
              WHEN price_new IS NULL THEN 2
              WHEN price IS NULL THEN 3
              ELSE 4
         END
请参阅此 SQLFiddle 演示:http://sqlfiddle.com/#!9/57c8eb3/6 .

关于mysql - 如何从 MySQL 中的比较和空检查指定 ORDER BY?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62672205/

相关文章:

java - 您将 SQL 查询放在哪里?

javascript - Dropkick - 选择问题数组

jquery - 多个选择会禁用彼此的选项

php - mysql_fetch_array()/mysql_fetch_assoc()/mysql_fetch_row()/mysql_num_rows 等...期望参数 1 是资源

Java BoneCP MySQL 连接超时

php - 错误级别和哪一行的错误?

mysql - 与许多用户一起使用 Plone 4 和 pas.plugins.sqlalchemy

sql - 获取 "comma-separated list near ' xx.yy'无效"与 dbms_utility.comma_to_table

php - 为什么在 CONCAT 之后 MySQL 中的变量不相等?

php - MySQL/PHP 中的时区偏移量(和 st/dst 更改)