将三个表与两个动态值组合

时间:2019-01-05 18:26:34

标签: mysql sql

我正在尝试为一个猜谜游戏创建一个数据库,让玩家应该猜出给定产品的价值。我有三张桌子。

一张产品表,其中包含以下列:

  • ProductID
  • 产品名称(VarChar)

一张有以下各列的球员表

  • PlayerID
  • PlayerName(VarChar)

存储玩家,产品及其猜测的一张桌子,即

  • GuessID
  • PlayerID
  • ProductID
  • 猜(Int)

我正在尝试找到一种方法来组合哪个球员(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。这对我来说没有任何意义。

如果您能向我指出正确的方向,我将不胜感激。

干杯。

3 个答案:

答案 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+中可用。