Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 在彼此内部使用多个SQL语句_Mysql - Fatal编程技术网

Mysql 在彼此内部使用多个SQL语句

Mysql 在彼此内部使用多个SQL语句,mysql,Mysql,我有3个表格:用户、投票和歌曲 歌曲包含歌曲的详细信息 投票包含歌曲id、投票用户和投票值 用户包含用户详细信息 当用户对歌曲投票时,他们的投票将被存储。1或0。每首歌都有一种体裁,每一次投票都会得到认可 我想做的是这样的 Pop 1 Rock 3 Reggie 4 Vote percent is the total amount of 1s received so 1, 3, 4. These as a % is my aim so Reggie would be 50%. (8

我有3个表格:用户、投票和歌曲

歌曲包含歌曲的详细信息 投票包含歌曲id、投票用户和投票值 用户包含用户详细信息

当用户对歌曲投票时,他们的投票将被存储。1或0。每首歌都有一种体裁,每一次投票都会得到认可

我想做的是这样的

Pop    1
Rock   3
Reggie 4

Vote percent is the total amount of 1s received so 1, 3, 4. 
These as a % is my aim so Reggie would be 50%. (8/4) and so on...
I then want to use this list of prefered genres to pick songs based on the % values.
因此,如果有任何雷吉歌曲,这将返回列表中的第一个

SELECT s.* FROM song s
WHERE (
SELECT 100.00 * SUM(CASE WHEN vote = '1' THEN 1 WHEN vote = '2' THEN 0.5
                         ELSE 0 END) / COUNT(v.vote) AS votePercent 
                         FROM song s 
                         LEFT JOIN collaborate c 
                         ON s.song_id = c.song_id 
                         LEFT JOIN voting v 
                         ON s.song_id = v.song_id
                         WHERE v.user_id = 'user0d1c-944f-4fff-b819-16869750f2d4'
                         ) 
                          GROUP BY s.genre;
到目前为止,我所尝试的似乎是不正确的,因为对于体裁来说,百分比值是100%和50%,而不是总票数的百分比

另外,我目前的查询几乎肯定会返回已经投票的歌曲


我是否走错了方向,或者这对我希望实现的目标有希望吗?

我认为问题在于你的
分组,当你得到
计数(v.vote)
时,是分组计数,而不是总计数

试试这个:

SELECT s.* FROM song s
WHERE (
SELECT 100.00 * SUM(CASE WHEN vote = '1' THEN 1 WHEN vote = '2' THEN 0.5
                         ELSE 0 END) / (SELECT COUNT(*) FROM voting) AS votePercent 
                         FROM song s 
                         LEFT JOIN collaborate c 
                         ON s.song_id = c.song_id 
                         LEFT JOIN voting v 
                         ON s.song_id = v.song_id
                         WHERE v.user_id = 'user0d1c-944f-4fff-b819-16869750f2d4'
                         ) 
                         GROUP BY s.genre;
接下来可能出现的问题是count和sum都是整数,因此mysql可能会从结果中删除十进制值

要解决此问题,我们可以将总和转换为十进制:

SELECT s.* FROM song s
WHERE (
SELECT 100.00 * CAST(SUM(CASE WHEN vote = '1' THEN 1 WHEN vote = '2' THEN 0.5
                         ELSE 0 END) as DECIMAL(10,2) / (SELECT COUNT(*) FROM voting) AS votePercent 
                         FROM song s 
                         LEFT JOIN collaborate c 
                         ON s.song_id = c.song_id 
                         LEFT JOIN voting v 
                         ON s.song_id = v.song_id
                         WHERE v.user_id = 'user0d1c-944f-4fff-b819-16869750f2d4'
                         ) 
                         GROUP BY s.genre;

这是未经测试的,但我认为它可能会为您指明正确的方向。

这是可行的。您是否可以编辑帖子以列出表结构(即数据类型)?谢谢