我有两个MySQL表。我想要做的是导出值1比值2小1的信息,其中ID_1没有值1和值2相等。
注意:
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
答案 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_1
或NULL
。 (你知道为什么吗?)所以比较从来都不是“真实的”;它始终是“假”(因为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,