对Table1的查询返回ID,table2包含评级,如何通过连接表1和&获得SUM评级。 table2在1个查询中?

时间:2014-05-30 04:00:31

标签: php mysql sql join

给出这些表:

Table1
asID mID aType rID sNo
1    2   11    212 1
4    2   8     242 1
4    2   7     241 1
3    2   11    547 2
2    2   3     567 2
4    2   2     577 2
6    3   11    785 1
1    3   6     735 1

table2
asID rating
1    1
1    -1
3    1
3    1
3    1
4    1

注意:

表1中的

  • rID是唯一的。
  • (mID,sNo)组合是唯一的。让我们说这些组合中的每一个都会创造一个大块。
  • 这些块中的每一个都将具有1&只有1 aType=11。每个块不能包含2个aType=11
  • asID可以在一个块中重复。例如,在块1(mID=2 & sNo=1
  • 中重复4次2次
表2中的

  • 评级可以是1或-1
  • asID可以重复多次。

因此,假设用户输入aType=11,然后在表1中我们可以提取

Query1
mID aType rID sNo
2   11    212 1
2   11    547 2
3   11    785 1

因此,在搜索aType=11之后,我们将知道3个块:

-Chunk 1(mID = 2,sNo = 1)

-Chunk 2(mID = 2,sNo = 2)

-Chunk 3(mID = 3,sNo = 1)

但是,查询1缺少评级信息的总和。我需要为查询1中的每个块获得一些评级。

-Chunk 1的唯一asID为1& 4(注意:4次重复2次)。并且块1在表2中应该具有rating = 1cos的总和,因为1的ID是+1& -1& asID为4是+1。

因此,当用户搜索aType = 11时的最终查询如下所示:

Query1
mID aType rID sNo sumOfRating
2   11    212 1   1
2   11    547 2   4
3   11    785 1   0

我们可以在1个查询中实现这个吗?

查询1:select mID, aType, rID, sNo from table1 where aType=11那么我们应该修改那个查询,以便我们可以在最终表格中包含评级标准?

我正在使用MYSQL 5.0

1 个答案:

答案 0 :(得分:3)

您拥有的一个选项是使用相关子查询:

select mid, atype, rid, sno,
  (
    select sum(t2.rating)
    from table2 t2
      join (
        select distinct asid, mid, sno
        from table1
        ) t11 on t2.asId = t11.asId
    where t1.mid = t11.mid and t1.sno = t11.sno
  ) sumofrating
from table1 t1
where atype = 11;

关键是您必须使用子查询来获得不同的asid/mid/sno组合(这样您就不会计算4次评分两次)。