销售数据库中有3个表格:orders(order_id, user_id, item_id, quantity, date), users(user_id, name, discount_percent) and items(item_id, name, type, price)
。我试图生成每月的利润由用户分组的报表按天数必须看这个(片段):准备好的语句语法错误
|-------user--------|----------day_1--------|---------day_2---------|---------day_3---------| etc. |
|-user_name_1-|-sum_of_expenses-|-sum_of_expenses-|-sum_of_expenses-| etc. |
|-user_name_2-|-sum_of_expenses-|-sum_of_expenses-|-sum_of_expenses-| etc. |
我用下面的准备语句来实现:
SELECT
GROUP_CONCAT(DISTINCT CONCAT('SUM(IF(DATE(orders.date) = \'',
DATE(orders.date),
'\', orders.quantity * items.price * (1 - users.discount_percent/100), 0)) AS ',
DATE(orders.date))
ORDER BY DATE(orders.date))
INTO @sql FROM
orders;
SET @sql = CONCAT('SELECT users.name, ', @sql, ' FROM
users
INNER JOIN
orders ON users.user_id = orders.user_id
INNER JOIN
items ON orders.item_id = items.item_id
GROUP BY users.name
ORDER BY users.user_id');
PREPARE statement FROM @sql;
EXECUTE statement;
DEALLOCATE PREPARE statement;
对于由于某种原因,它给了我一个警告:
1 row(s) affected, 1 warning(s): 1260 Row 8 was cut by GROUP_CONCAT()
然后一个错误:
Error Code: 1064. You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '2015-01-01,SUM(IF(DATE(orders.date) = '2015-01-02', orders.quantity * items.pric' at line 1
我认为这与日期或引号的格式有关,但是为了解决问题而输入的内容都失败了。
另外我想弄清楚如何通过php的mysqli prepare()方法实现这个复杂的语句。
我不认为'SELECT ... INTO'变量将直接工作在MySQL。但是,为什么在给它分配一些东西后立即覆盖'@ sql'? –