将数百行数据与另一个表中的数据进行比较

Posted

技术标签:

【中文标题】将数百行数据与另一个表中的数据进行比较【英文标题】:Compare hundreds of rows of data against one in another table 【发布时间】:2016-09-17 23:14:45 【问题描述】:

我有一个有趣的问题实际上让我很伤心。

我有两张化妆相同的桌子。一张桌子保存给定抽奖的中奖彩票号码,另一张桌子保存 500 张随机生成的该抽奖的“彩票”。

我正在尝试编写一些代码来告诉我 500 张票中有多少张有 3 个匹配号码、4 个匹配号码、5 个匹配号码,当然还有全部 6 个匹配号码。

两个表的表结构是

id、playDate、num1、num2、num3、num4、num5、num6。

这就是我所在的位置,在任何人说任何话之前,我就知道这是不正确的。在这里真的很挣扎:

SELECT count(*) AS c, w.*, l.* 
FROM winningNums AS w, lottoNums AS l
WHERE w.playDate = "2016-10-10"
AND l.playDate = "2016-10-10"
AND l.num1 (
w.num1, w.num2, w.num3, w.num4, w.num5, w.num6 
)

我也一直在打这样的东西

SELECT * 
FROM winningNums AS w
INNER JOIN lottoNums AS l
ON w.playDate = l.playDate
AND w.num1 = l.num1
AND w.num2 = l.num2
AND w.num3 = l.num3
AND w.num4 = l.num4
AND w.num5 = l.num5
AND w.num6 = l.num6

我面临的主要问题是 num1、num3 和 num4(来自彩票)与 num2、num5 和 num6(来自中奖号码)匹配可能会赢得 3 场比赛。

帮助:-)

【问题讨论】:

规范化您的数据,而不是有两列 playDate 和 lottoNumbrer 每个 playDate 有六行。那么你的加入就很简单了。 同意@Niagaradad - 这是数据规范化的经典示例。 我不确定你们的意思,但至少这是一个线索。感谢您为我指明正确的方向。我会去学习标准化。以前没有遇到过。 【参考方案1】:
SELECT l.*,
    (l.num1 IN (w.num1, w.num2, w.num3, w.num4, w.num5, w.num6)) +
    (l.num2 IN (w.num1, w.num2, w.num3, w.num4, w.num5, w.num6)) +
    (l.num3 IN (w.num1, w.num2, w.num3, w.num4, w.num5, w.num6)) +
    (l.num4 IN (w.num1, w.num2, w.num3, w.num4, w.num5, w.num6)) +
    (l.num5 IN (w.num1, w.num2, w.num3, w.num4, w.num5, w.num6)) +
    (l.num6 IN (w.num1, w.num2, w.num3, w.num4, w.num5, w.num6))
    AS hits
FROM winningNums AS w
CROSS JOIN lottoNums AS l
WHERE w.playDate = "2016-10-10"
  AND l.playDate = "2016-10-10"
HAVING hits >= 3
ORDER BY hits DESC

这会将彩票中的每个号码与彩票中的每个号码进行比较。并且所有命中/匹配都将被添加。

【讨论】:

这看起来不错,但出现此错误:“您的 SQL 语法有错误;请查看与您的 mysql 服务器版本相对应的手册,以了解在 '+ l.num2 IN ( w.num1, w.num2, w.num3, w.num4, w.num5, w.num6) + l.num3 IN' 在第 2 行" 一些缺少括号,但现在这似乎工作得很好。谢谢。【参考方案2】:

您可以使用 IN 语句查找返回 1 或 0 的匹配项,然后将它们相加以计算匹配项的数量... 然后像这样使用 HAVING 检查匹配 >= 3。

SELECT lot.id as lotid,draw.id as drawid,
     (draw.num1 IN (lot.num1,lot.num2,lot.num3,lot.num4,lot.num5,lot.num6))
   + (draw.num2 IN (lot.num1,lot.num2,lot.num3,lot.num4,lot.num5,lot.num6))
   + (draw.num3 IN (lot.num1,lot.num2,lot.num3,lot.num4,lot.num5,lot.num6))
   + (draw.num4 IN (lot.num1,lot.num2,lot.num3,lot.num4,lot.num5,lot.num6))
   + (draw.num5 IN (lot.num1,lot.num2,lot.num3,lot.num4,lot.num5,lot.num6))
   + (draw.num6 IN (lot.num1,lot.num2,lot.num3,lot.num4,lot.num5,lot.num6))
   AS matches
FROM lot
  INNER JOIN draw
HAVING matches >= 3;

sqlfiddle

【讨论】:

以上是关于将数百行数据与另一个表中的数据进行比较的主要内容,如果未能解决你的问题,请参考以下文章

将一个表的列中的数据与另一个表中的同一列进行比较

将一个表中的值与另一表中具有相同属性的值的平均值计算进行比较

将一个表中的多个值与另一个表中的多个值进行比较

如何将数据框中的一行的值与另一个数据框中的多行进行比较(包括计算)

选择表中的列与另一个表中的列不同的数据

有没有办法将数据帧的一列中的所有行与另一个数据帧的另一列(火花)中的所有行进行比较?