在我的MySQL数据库中,我有三张表。一个是具有ID和更多列的项目列表。第二个是具有名字的用户列表等等。如果用户评价和/或购买物品,则记录在第三位。评级和购买的列的数据类型将是一个位标志(1/0)。同时选择count/sum和true/false bit-flag
所以,现在我想在只有一个 SQL查询返回一个项目是如何经常地评价,如果它是由特定的用户评价。
输入参数是:
- 用户
- 项
结果应该是:
- 计数(额定)
- 真/假(由指定的用户的额定)
在我的MySQL数据库中,我有三张表。一个是具有ID和更多列的项目列表。第二个是具有名字的用户列表等等。如果用户评价和/或购买物品,则记录在第三位。评级和购买的列的数据类型将是一个位标志(1/0)。同时选择count/sum和true/false bit-flag
所以,现在我想在只有一个 SQL查询返回一个项目是如何经常地评价,如果它是由特定的用户评价。
输入参数是:
结果应该是:
这就是所谓的枢轴。
SELECT item, SUM(rated) AS no_rated, SUM(bought) AS no_bought,
MAX(user = 1 AND rated = 1) AS rated_by_1,
MAX(user = 2 AND rated = 1) AS rated_by_2,
MAX(user = 1 AND bought = 1) AS bought_by_1,
MAX(user = 2 AND bought = 2) AS bought_by_2
FROM YourTable
GROUP BY item
查看MySQL pivot table了解关于在MySQL中旋转的更多信息。如果用户数量是动态的,所以你不能像我那样对它们进行硬编码,你需要编写动态SQL。有些网站的链接显示了如何在这个问题的答案中做到这一点。
这是一个好主意。对我来说,这很容易,但我只需要一个项目和一个用户。 – Matthias 2014-09-11 13:15:12
@Matthias:然后只需添加'WHERE item = 1'并删除用户= 2的两行。 – 2014-09-11 13:20:25
用户数量(表示结果集中的列数)应该是动态的? – 2014-09-11 13:08:25
第二张照片只是为了理解。假设我使用SQL语句查询item = 1和user = 1。然后,我希望获得该物品多久评价一次(所有用户)以及用户1是否评价过物品1。我发现这个:** select count(*),count(当user = 1 then 1 else null end时)from rating where item = 1 **但是有没有更简单的方法? – Matthias 2014-09-11 13:09:48