我正在尝试为一个猜谜游戏创建一个数据库,让玩家应该猜出给定产品的价值。我有三张桌子。
一张产品表,其中包含以下列:
一张有以下各列的球员表
存储玩家,产品及其猜测的一张桌子,即
我正在尝试找到一种方法来组合哪个球员(PlayerName)对每个产品(ProductName)做出最高猜测(Guess),即一种汇总每个产品,对每个产品的最高猜测以及猜出名字的名字och球员。
到目前为止,我只能获得每个产品的正确ProductName和正确的Guess值。不知何故,这对于PlayerName不起作用,而且我每次都会得到错误的名称。
SELECT pl.PlayerName, MAX(g.Guess), p.ProductName
FROM
guess g
INNER JOIN player pl on g.PlayerID = pl.PlayerID
INNER JOIN product p on g.ProductID = p.ProductID
GROUP BY g.ProductID;
我想我的问题是与特定产品相关的每一行都具有两个动态值; Guess和PlayerID,每当我尝试按Max(Guess)排序时,都会遇到问题。我无法理解为上述查询选择的PlayerID。这对我来说没有任何意义。
如果您能向我指出正确的方向,我将不胜感激。
干杯。
答案 0 :(得分:1)
使用相关子查询为每个产品选择最高的猜测,然后在外部查询中选择相关的参与者和产品记录,例如:
SELECT
p.productname, u.playername, g.guess as "max guess"
FROM
guess_table g
INNER JOIN product_table p ON p.productid = g.productid
INNER JOIN players_table u on u.playerid = g.playerid
WHERE g.guess = (SELECT MAX(guess) FROM guess_table WHERE productid = p.productid)
答案 1 :(得分:0)
您可以在此查询中使用最后一个值。您还可以通过对desc进行排序来使用第一个值(不必在前面和后面给出无限制的内容。而且,这是基于这样的假设,即猜测在产品名称中是唯一的,因此排序将是一致的。
样本数据和输出将有助于查看是否可以预期,但是我认为根据您提到的内容,这里将可以使用。
SELECT distinct p.ProductName,
last_value(Guess) over (partition by p.ProductName order by Guess rows between
unbounded preceding and unbounded following ) GuessNumber,
last_value(pl.PlayerName) over (partition by p.ProductName order by Guess rows
between unbounded preceding and unbounded following ) PlayerName
FROM guess g
inner join player pl on g.PlayerID = pl.PlayerID
inner join product p on g.ProductID = p.ProductID
答案 2 :(得分:0)
一种方法是在MySQL中使用一些技巧:
SELECT SUBSTRING_INDEX(GROUP_CONCAT(pl.PlayerName ORDER BY g.guess DESC), ',', 1) as PlayerName,
MAX(g.Guess), p.ProductName
FROM guess g JOIN
player pl
ON g.PlayerID = pl.PlayerID JOIN
product p
ON g.ProductID = p.ProductID
GROUP BY p.ProductName;
此方法肯定有局限性。 GROUP_CONCAT()
的内部字符串表示形式被限制为大约1000个字符(尽管可以扩展)。以上假设名称不包含逗号(尽管可以使用其他分隔符)。
更好的解决方案是使用窗口函数,但是这些函数仅在MySQL 8+中可用。