2014-09-11 44 views
1

在我的MySQL数据库中,我有三张表。一个是具有ID和更多列的项目列表。第二个是具有名字的用户列表等等。如果用户评价和/或购买物品,则记录在第三位。评级和购买的列的数据类型将是一个位标志(1/0)。同时选择count/sum和true/false bit-flag

rating table

所以,现在我想在只有一个 SQL查询返回一个项目是如何经常地评价,如果它是由特定的用户评价。

输入参数是:

  • 用户

结果应该是:

  • 计数(额定)
  • 真/假(由指定的用户的额定)

enter image description here

+0

用户数量(表示结果集中的列数)应该是动态的? – 2014-09-11 13:08:25

+0

第二张照片只是为了理解。假设我使用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

回答

2

这就是所谓的枢轴

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。有些网站的链接显示了如何在这个问题的答案中做到这一点。

+0

这是一个好主意。对我来说,这很容易,但我只需要一个项目和一个用户。 – Matthias 2014-09-11 13:15:12

+1

@Matthias:然后只需添加'WHERE item = 1'并删除用户= 2的两行。 – 2014-09-11 13:20:25