Mysql 在彼此内部使用多个SQL语句
我有3个表格:用户、投票和歌曲 歌曲包含歌曲的详细信息 投票包含歌曲id、投票用户和投票值 用户包含用户详细信息 当用户对歌曲投票时,他们的投票将被存储。1或0。每首歌都有一种体裁,每一次投票都会得到认可 我想做的是这样的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
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;
这是未经测试的,但我认为它可能会为您指明正确的方向。这是可行的。您是否可以编辑帖子以列出表结构(即数据类型)?谢谢