需要从一个真正混乱的mysql表中获取数据

时间:2012-09-27 11:31:22

标签: php mysql

表1:

id  |  video_id  | group_id  |  img
=======================================
1   |  1         | 1         |  
2   |  2         | 1         | abc.png 
3   |  3         | 2         | bef.png 
4   |  4         | 3         | dca.png
5   |  5         | 1         |  
6   |  6         | 2         |  
7   |  8         | 1         |  

表2: -

video_id  | week  |  count  |  type
===================================
1         | 2     |  2      |  0
2         | 2     |  1      |  1
1         | 3     |  5      |  0
1         | 3     |  3      |  1
3         | 3     |  4      |  0
1         | 3     |  1      |  0

现在我知道这个结构搞砸了,需要进行规范化,但由于我没有修改权限,所以我坚持这个。所以请耐心等待。

如您所见,第一个表在一个组中存储了多个视频,每个组中只有一个视频可以拥有一个关联的图像。 第二个表按周存储视频观看的类型和数量。

现在,我需要一个mysql查询来获取计数的SUM,视频ID以及针对特定周的此视频的组ID存在的图像。问题是,图像是针对一个组的一个视频存储的,该视频可能有也可能没有最高的总和视图,但是查询仍然需要根据该组的图像以及视频ID来获取图像。以及具有最大观看次数的视频的其他信息。

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

好的,将凌乱的数据库结构排除在外,你对此意味着什么:

  

但是查询仍然需要针对哪一个获取图像   视频包含该组的图像

你究竟在哪里需要这个小组?这样的事情可能就是你想要的:

SELECT table2.video_id, SUM(table2.count), table1.group_id, table1.img FROM table2 
LEFT JOIN table1 ON table2.video_id = table1.video_id
GROUP BY table2.video_id;

这将选择视频ID,总计数(在所有周内),group_id和属于该视频的图像。虽然涉及任何检查都没有group_id,因为我不确定你想要什么。

除此之外,我同意其他人的建议:尝试获得更好的结构化表格!

编辑:如果你需要将图像和groupid放在一起,你可以运行以下查询,但它只会选择第一个非空的img。所以你必须确保group_id和set img之间的关系是1:1,否则它可能会搞砸。

更新的查询将是:

SELECT * FROM 
    (SELECT table1.group_id,
          (SELECT tbl.img FROM table1 tbl WHERE tbl.group_id = table1.group_id AND img IS NOT NULL /*or whatever the empty value for img is*/ LIMIT 1) AS img,
          table2.video_id,
          SUM(table2.count) AS totalviews
    FROM table2 
    LEFT JOIN table1 ON table2.video_id = table1.video_id 
    GROUP BY table1.group_id, table2.video_id) 
    AS tmp
WHERE totalviews = (SELECT SUM(tbl2.count) FROM table2 AS tbl2 WHERE tbl2.video_id = tmp.video_id)
GROUP BY group_id;