MySQL查询返回没有行

时间:2011-12-17 00:29:06

标签: mysql sql

我有两个MySQL表。我想要做的是导出值1比值2小1的信息,其中ID_1没有值1和值2相等。

注意:

  • 字段值1和2只是整数。
  • 每个不同的ID_A具有相同的Value_2
  • 如果有两个Value_1比Value_2少一个,请查看Value_3并选择一个更高的
  • 我在这里有两个表的原因是因为我要从两个表中输出信息
  • 我们可以为此编写一个脚本,但是我需要在一个命令中执行此操作以获得奖励积分(我的导师宣称这是可能的)...我甚至没有为此创建脚本,因为我不喜欢我真的知道怎么做......

tableA看起来像这样:

ID_1  ID_2
A     A
A     B
B     A
B     B
C     A
C     B
C     C

tableB看起来像这样:

ID_1  ID_2  Value_1  Value_2  Value_3
A     A     2        3        NULL
A     B     3        3        NULL
B     A     4        5        NULL
B     B     7        5        NULL
C     A     7        8        98
C     B     3        8        NULL
C     C     7        8        56

查询应该返回:

ID_1  ID_2
B     A
C     A

到目前为止,这是我所拥有的......并且它不会返回任何命中,这让我感到困惑。我相信这是我需要修复的第一个WHERE语句之后的AND子句

SELECT CONCAT(...)
  INTO OUTFILE '/tmp/outfile.tab'
       FIELDS TERMINATED BY '\t'
       ESCAPED BY ''
  FROM tableA
 INNER
  JOIN tableB
    ON tableA.ID_1 = tableB.ID_1
   AND tableA.ID_2 = tableB.ID_2
 WHERE tableB.Value_1 - 1 = tableB.Value_2
   AND tableA.ID_1 !=
        ( SELECT DISTINCT
                 ID_1
            FROM tableB
           WHERE ID_1 = tableA.ID_1
             AND Value_1 = Value_2
        )
;

最后一点:我们通过putty发出所有命令,我们可以在其中访问MySQL

3 个答案:

答案 0 :(得分:2)

说实话,我仍然不明白你想要做什么,但我可以解释为什么你的查询没有返回任何行。

请看这个条款:

   AND tableA.ID_1 !=
        ( SELECT DISTINCT
                 ID_1
            FROM tableB
           WHERE ID_1 = tableA.ID_1
             AND Value_1 = Value_2
        )

子查询必须始终返回tableA.ID_1NULL。 (你知道为什么吗?)所以比较从来都不是“真实的”;它始终是“假”(因为tableA.ID_1 != tableA.ID_1必然是“假”)或“空/不确定”(因为tableA.ID_1 != NULL是“空/不确定”)。因此,此子句会过滤掉查询中的所有结果 - 无论您的查询的其余部分可能会说什么。

答案 1 :(得分:1)

我不是100%肯定这个问题,但是如果我做对了,那么不应该选择tableB的第一行(http://imgur.com/a/r3Qy5#1中的第25行),因为ID_1 = A的值为Value_1 = 3第二行(http://imgur.com/a/r3Qy5#1中的第26行),与第一行的Value_1(http://imgur.com/a/r3Qy5#1中的第25行)相同。

所以你可以从像

这样的东西开始
SELECT .... FROM
tableA NATURAL JOIN tableB
WHERE Value_1=Value_2-1
AND Value_2 NOT IN (SELECT tb.Value_1 from tableB AS tb WHERE tb.ID_1=tableB.ID_1)

满足要求#1和#2。对于需求#3(如果ID_1有两行,选择Value_3最高的那一行),我们需要在Value_3上对其进行排序并将其包装在superquery中进行分组:

SELECT .... FROM (
SELECT * FROM
tableA NATURAL JOIN tableB
WHERE Value_1=Value_2-1
AND Value_2 NOT IN (SELECT tb.Value_1 from tableB AS tb WHERE tb.ID_1=tableB.ID_1)
ORDER BY Value_3 DESC
) AS innerview
GROUP BY Value_1,Value_2

为您的示例中的测试数据提供了正确的答案。

答案 2 :(得分:0)

您首先必须对按“ID_1”分类和Value1,value2分组的“Value_3”条件应用测试。通过在此处应用WHERE子句,您将获得最终的记录集,包括其结果集中最高值3条目的内容。现在,它再次连接到tableB AGAIN,但匹配限定条目。由于COALESCE()将在第一个结果集中将任何NULL值更改为0,因此JOIN子句也必须匹配该值。与没有应用Value_3的“A”和“B”组的情况一样,在“C”组中,它将具有有效值并且在条目中预先得到最大值为98.表示,当重新连接回TableB的实例“tb2”时,第二次将获得该组的“A”的正确ID_2。

select
      MaxQualified.ID_1,
      tb2.ID_2,
      MaxQualified.Value_1,
      MaxQualified.Value_2,
      tb2.Value_3
   from 
      ( select
              tb.ID_1,
              tb.Value_1,
              tb.Value_2,
              MAX( COALESCE( tb.Value_3, 0 ) ) as HighestVal3
           from
              TableB tb
           where
              tb.Value_1 +1 = tb.Value_2
           group by
              tb.ID_1,
              tb.Value_1,
              tb.Value_2 ) MaxQualified

         JOIN TableB tb2
            on MaxQualified.ID_1 = tb2.ID_1
           AND MaxQualified.Value_1 = tb2.Value_1
           AND MaxQualified.Value_2 = tb2.Value_2
           AND MaxQualified.HighestVal3 = COALESCE( tb2.Value_3, 0 )

现在,正如所说,这是作业,如果你有多个ID1,Value1,Value2,Value3条目,这可能会失败或给出多个答案。它将返回完全相同的共同标准的所有“ID2”实例。您甚至必须再嵌套一个级别来删除该级别的区别。

您的答案也应该返回“A”,“A”,2,3,