2015-09-02 3 views
0

После поиска в Google и просмотра SO я вышел с нерабочим решением для определенного типа запроса. У меня есть таблица, которая используется для преобразования значения из другой таблицы в текст. Скажем:выполнить JOIN, если объединенное поле имеет значение

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

и главная таблица

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

Так что, если я извлечь строку FRM основной таблицы I заменить значение от 1 значения а в дом и так далее.

ValueA устанавливается на определенных условиях. В любом другом случае он будет оставлен пустым (поле не должно быть NULL).

Если я сделаю присоединение, вторая строка будет опущена, так как valueA пуст. Запрос

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

так что я пытался сказать: выполнить объединение только если значение а не пустой , и я написал это условие:

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

как я прочитал в this question но Я не получил то, что хочу, вероятно, потому что условие И в этом случае было основано на другом поле, а не на объединенном. Я могу добавить еще одну строку в таблице словаря с помощью пары 0 - NONE и превратить все пустое значение A в 0, но я хотел бы узнать, правильно ли я нахожусь на правильном пути с моим запросом и что я делаю неправильно. Это так называемое «условное соединение» возможно в mysql? я также имел взглянуть на this question, но это решение было бы сделать этот запрос слишком сложным для его цели, и в этом случае я бы пойти на «план Б» заменить пустой с 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 в результате запроса, просто добавьте это поле в SELECT части, как welll в valueA от main при необходимости:

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

Использовать UNION сочетать JOIN с запросом, который получает все строки с пустым 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

Хорошая точка, но почему вы также добавляете main.valueA! = '' В первый SELECT? –

+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, а затем использовать, если возвращать разные значения для колонка значения а (либо значение а, либо текст)

Что-то вроде этого: -

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 
Смежные вопросы