2015-09-02 29 views
0

谷歌搜索後,看着所以我出來了一個不工作的解決方案爲特定類型的查詢。我有一個表格用於轉換文本中另一個表格的值。比方說:執行加入,如果加入字段有一個值

id - text 
1 - House 
2 - Villa 
3 - Camper 

和主表是

id - valueA - valueB - valueC 
1 - 1 - whastington - 3000 
2 - - NewYork - 5000 

所以,如果我抓取行FRM主表我替換值值a從1到房屋等。

ValueA在特定條件下設置。在任何其他情況下,它將留空(該字段不打算爲NULL)。

如果我進行連接,第二行將被省略,因爲valueA是空白的。查詢是

SELECT id,text,valueB,valueC FROM main JOIN dic on main.valueA = dic.id 

所以我想說:只執行;如果valueA不是空白 的加入,我寫了這個條件爲:

SELECT id,text,valueB,valueC FROM main 
JOIN dic ON (main.valueA = dic.id AND main.valueA <>'') 

我在this question讀,但我沒有得到我想要的東西,可能是因爲這種情況下的AND條件是基於另一個字段而不是加入的。我可以在字典表中添加另一行,使用0 - NONE對,並將所有空值A都設爲0,但我想知道我是否在正確的路徑上查詢以及我做錯了什麼。這個所謂的「條件連接」是可能的在MySQL? 我也看了一下this question但這種方法將使這個查詢太複雜,它的目的,在這種情況下,我會去更換的「B計劃」空0

+0

什麼是示例數據您預期的結果? – Simimmo

+0

我想從main中選擇兩行。與平原加入我想念第2行 –

回答

3

我無法理解你的目標。在我看來,你只需要LEFT JOIN

SELECT main.id, 
    dic.text, 
    main.valueB, 
    main.valueC 
FROM main 
LEFT JOIN dic 
on main.valueA = dic.id 

UPDATE,如果你想看到dic.id在查詢結果中,如果需要從main只想補充一點,場SELECT一部分welll爲valueA

SELECT main.id, 
    dic.text, 
    dic.id DIC_ID, 
    main.valueA MAIN_VALUEA, 
    main.valueB, 
    main.valueC 
FROM main 
LEFT JOIN dic 
on main.valueA = dic.id 

DIC_ID和MAIN_VALUEA只是列的別名,您可以設置自己的名稱或將其留空。

+0

是的。左連接是另一種選擇。但是,如果條件不是「不是空白」,而是「不是特定的值」?你是否必須把它放在沒有其他選擇的地方? –

+0

不能明白你的觀點。請使用一些數據樣本來描述 – Alex

+0

@LelioFaieta它適用於任何未出現在'dic.id'中的值。 – Barmar

0

使用UNIONJOIN結合用一個查詢獲取所有行爲空的valueA

SELECT id, text, valueB, valueC 
FROM main 
JOIN dic ON main.valueA != '' AND main.valueA = dic.id 
UNION 
SELECT id, '', valueB, valueC 
FROM main 
WHERE main.valueA = '' 
+0

好點,但你爲什麼還要在第一個SELECT中添加main.valueA!=''? –

+0

我想這是多餘的,但它使意圖更清晰。 – Barmar

+0

啊,好的。感謝提示! –

0

您還可以使用子查詢來做到這一點(或LEFT JOIN)

SELECT id, 
(SELECT text FROM dic WHERE dic.id = main.valueA), -- will return NULL of not found, use IFNULL if you want another value to be returned -- 
valueB, 
valueC 
FROM main 
+0

子查詢會影響性能!在這個具體案例中加入是唯一的方法。 –

0

如果我理解正確的話,我認爲你需要一個LEFT OUTER JOIN,但然後使用IF返回了不同的值值a柱(無論是值a或文本)

事情是這樣的: -

SELECT main.id, 
     IF(dic.id IS NULL, main.valueA, dic.text) 
     main.valueB, 
     main.valueC 
FROM main 
LEFT OUTER JOIN dic on main.valueA = dic.id