用两个动态值组合三个表

yuvru6vn  于 2021-06-15  发布在  Mysql
关注(0)|答案(3)|浏览(374)

我正在尝试为一个猜谜游戏创建一个数据库,在这个游戏中,玩家应该猜测给定产品的价值。我有三张table;
一个包含以下列的产品表:
产品ID
产品名称(varchar)
为玩家提供一个表,包含以下列
玩家ID
玩家名称(varchar)
一个存储玩家、产品及其猜测的表,即
猜ID
玩家ID
产品ID
猜测(int)
我正在尝试找到一种方法来组合哪个玩家(playername)对每个产品(productname)的猜测(guess)最高,即总结每个产品、每个产品的猜测最高以及做出猜测的玩家的姓名。
到目前为止,我只能为每个产品获得正确的产品名和正确的猜测值。不知何故,这对playername不起作用,我每次都会弄错名字。

  1. SELECT pl.PlayerName, MAX(g.Guess), p.ProductName
  2. FROM
  3. guess g
  4. INNER JOIN player pl on g.PlayerID = pl.PlayerID
  5. INNER JOIN product p on g.ProductID = p.ProductID
  6. GROUP BY g.ProductID;

我想我的问题是与特定产品相关的每一行都有两个动态值;guess和playerid,每当我尝试按max(guess)排序时,它都会给我带来问题。我无法理解为上述查询选择的playerid。这对我来说毫无意义。
如果你们能给我指出正确的方向,我将不胜感激。
干杯。

n8ghc7c1

n8ghc7c11#

您可以在此查询中使用最后一个值。您还可以通过对desc进行排序来使用第一个值(您不必给出无界的preceding和following。而且,这是基于猜测在产品名称中是唯一的假设,所以排序将是一致的。
样本数据和输出将有助于了解它是否是预期的,但我认为它将在这里工作的基础上,你提到的。

  1. SELECT distinct p.ProductName,
  2. last_value(Guess) over (partition by p.ProductName order by Guess rows between
  3. unbounded preceding and unbounded following ) GuessNumber,
  4. last_value(pl.PlayerName) over (partition by p.ProductName order by Guess rows
  5. between unbounded preceding and unbounded following ) PlayerName
  6. FROM guess g
  7. inner join player pl on g.PlayerID = pl.PlayerID
  8. inner join product p on g.ProductID = p.ProductID
cs7cruho

cs7cruho2#

使用相关子查询为每个产品选择最高猜测,然后在外部查询中选择相关的播放器和产品记录,如:

  1. SELECT
  2. p.productname, u.playername, g.guess as "max guess"
  3. FROM
  4. guess_table g
  5. INNER JOIN product_table p ON p.productid = g.productid
  6. INNER JOIN players_table u on u.playerid = g.playerid
  7. WHERE g.guess = (SELECT MAX(guess) FROM guess_table WHERE productid = p.productid)
f45qwnt8

f45qwnt83#

一种方法是在mysql中使用某种黑客手段:

  1. SELECT SUBSTRING_INDEX(GROUP_CONCAT(pl.PlayerName ORDER BY g.guess DESC), ',', 1) as PlayerName,
  2. MAX(g.Guess), p.ProductName
  3. FROM guess g JOIN
  4. player pl
  5. ON g.PlayerID = pl.PlayerID JOIN
  6. product p
  7. ON g.ProductID = p.ProductID
  8. GROUP BY p.ProductName;

这种方法肯定有局限性。的内部字符串表示形式 GROUP_CONCAT() 限制为1000个字符(尽管可以扩展)。上面假设名称不包含逗号(尽管可以使用其他分隔符)。
更好的解决方案是使用窗口函数,但这些函数仅在mysql 8+中可用。

相关问题