2011-12-17 112 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