2011-12-17 98 views
2

我有两个MySQL表。我试图做的是导出信息,其中值1小于值2,而ID_1没有值1和值2相等。MySQL查询没有返回行

注:

  • 字段值1和2都只是整数。
  • 每个不同ID_A具有相同VALUE_2
  • 如果有两个Value_1s是比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语句,我需要修复

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 
     ) 
; 

最后一个音符后的AND子句:我们发行过腻子所有的命令,我们可以在其中访问MySQL

+0

什么是表A和tableB的?如果他们有两个id值,是否意味着你只能使用tableB来完成你的任务? – melihcelik 2011-12-17 00:52:40

回答

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) 

这fullfills要求#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 

这给正确的在你的例子中回答测试数据。

+0

此错误不断返回: 错误1054(42S22):'字段列表'中的未知列'tableA.ID_1' – Raymosrunerx 2011-12-17 02:12:00

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必然是“false”)或“null/indeterminate”(因为tableA.ID_1 != NULL是“null/indeterminate”)。因此,无论查询的其余部分如何,本节都会过滤掉查询—中的所有结果。

0

您首先必须针对由您的“ID_1”分类和值1,值2分组的“Value_3”条件应用测试。通过在这里应用WHERE子句,您可以获得最终的记录集合,包括结果集中最高值3的条目。现在,它再次加入tableB AGAIN,但匹配符合条件的条目。由于COALESCE()将在第一个结果集中将任何NULL值更改为0,因此JOIN子句也必须匹配该值。就像没有应用Value_3的“A”和“B”组的情况一样,在“C”组中,它将具有有效值并且在最大值为98的条目中具有预结果。 ,当再次将表B重新连接回实例“tb2”时,第二次将为该集合获得适当的ID_2“A”。

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,值1,值2,值3项。它将返回完全相同的通用标准的所有“ID2”实例。你将不得不再做一个嵌套级别来消除这种区别。

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