【问题标题】:MariaDB SubqueryMariaDB 子查询
【发布时间】:2019-01-31 13:32:51
【问题描述】:

美好的一天!

我有这个 SQL,但不能用于托管。在局域网上一切都很好。我找不到问题所在。 Laravel 项目 SQL:

$data = DB::select('
            SELECT 
                DATE(o.created_at) as day,
                count(id) as count_all,
                count((SELECT id WHERE status=3)) as success,
                count((SELECT id WHERE status=5)) as return_order,
                count((SELECT id WHERE status=0 or status=4 or status=8)) as call_order,

                count((SELECT id WHERE status=7 or status=6 or status=1)) as otkaz,
                count((SELECT id WHERE status=2)) as nado_dostavit,

                SUM((SELECT offer_price)) as all_price,
                SUM((SELECT offer_price WHERE status=3)) as success_price,
                SUM((SELECT offer_price WHERE status=5)) as return_order_price,
                SUM((SELECT offer_price WHERE status=0 or status=4 or status=8)) as call_order_price,
                SUM((SELECT offer_price WHERE status=7 or status=6 or status=1)) as otkaz_price,
                SUM((SELECT offer_price WHERE status=2 )) as nado_dostavit_price,
                (SELECT sum(s.visitors) FROM statistics as s WHERE s.offer_id='.$user_id.') as visitors
            FROM 
                orders as o
            WHERE 
                  offer_id='.$user_id.'
                  AND  created_at between "'.$mother_later.'" AND "'.$today.'"
            GROUP BY day
            ORDER BY day desc
            limit 30
    ');

错误:

(2/2) 查询异常

SQLSTATE[42000]:语法错误或访问冲突:1064 你有一个 SQL 语法错误;检查与您对应的手册 MariaDB 服务器版本,用于在 'WHERE 附近使用正确的语法 status=3)) 成功,

【问题讨论】:

  • SELECTs 通常包含一个 FROM 子句,因此“一切正常”的概念似乎值得怀疑。

标签: mysql laravel mariadb


【解决方案1】:

您的子查询都没有FROM 子句,这就是您收到语法错误的原因。但是,您实际上并不想要这些位置的子查询。对于COUNT,您应该将它们替换为例如

SUM(CASE WHEN status=3 THEN 1 ELSE 0 END)

对于SUMs,您应该使用例如

SUM(CASE WHEN status=3 THEN offer_price ELSE 0 END)

所以总的来说,你的查询应该是:

$data = DB::select('
        SELECT 
            DATE(o.created_at) as day,
            count(id) as count_all,
            SUM(CASE WHEN status=3 THEN 1 ELSE 0 END) as success,
            SUM(CASE WHEN status=5 THEN 1 ELSE 0 END) as return_order,
            SUM(CASE WHEN status=0 OR status=4 OR status=8 THEN 1 ELSE 0 END) as call_order,
            SUM(CASE WHEN status=7 OR status=6 OR status=1 THEN 1 ELSE 0 END) as otkaz,
            SUM(CASE WHEN status=2 THEN 1 ELSE 0 END) as nado_dostavit,

            SUM(offer_price) as all_price,
            SUM(CASE WHEN status=3 THEN offer_price ELSE 0 END) as success_price,
            SUM(CASE WHEN status=5 THEN offer_price ELSE 0 END) as return_order_price,
            SUM(CASE WHEN status=0 OR status=4 OR status=8 THEN offer_price ELSE 0 END)  as call_order_price,
            SUM(CASE WHEN status=7 OR status=6 OR status=1 THEN offer_price ELSE 0 END) as otkaz_price,
            SUM(CASE WHEN status=2 THEN offer_price ELSE 0 END) as nado_dostavit_price,
            (SELECT sum(s.visitors) FROM statistics as s WHERE s.offer_id='.$user_id.') as visitors
        FROM 
            orders as o
        WHERE 
              offer_id='.$user_id.'
              AND  created_at between "'.$mother_later.'" AND "'.$today.'"
        GROUP BY day
        ORDER BY day desc
        limit 30
');

【讨论】:

  • SUM(CASE WHEN status=3 THEN 1 ELSE 0 END) 可以缩短为SUM(status=3)
  • @RickJames 你是绝对正确的。我只是想更通用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-23
  • 2018-02-05
  • 2014-12-09
  • 2021-04-06
  • 2018-08-19
相关资源
最近更新 更多