2013-05-22 6 views
0

У меня есть 3 таблицы t1, t2 и t3. Ниже приведены их схемы.MySQL select query

Мне нужно присоединиться к ним и иметь условие.

In t1 table, objectName can be one of 4: 'ABC', 'DEF', 'GHI', or 'JKL'. 
If t1.objectName is 'ABC', I need to join t1.idObject with t2.id1. 
If t1.objectName is 'DEF', I need to join t1.idObject with with t2.id2. 
If t1.objectName is 'GHI', I need to join t1.idObject with t2.id3. 
If t1.objectName is 'JKL', I need to join t1.idObject with t3.id4. 

I need to select t1.idObject, t1.objectName, t2.custName, t4.Message. 

Кроме того, если t1.objectName является «DEF» или «ГХИ», я хочу custName быть нулевым в результате выбора.

-

create table t1 (idObject int, objectName varchar(20)); 
create table t2 (id1 int, id2 int, id3 int, custName varchar(20)); 
create table t3 (id4 int, Message varchar(20)); 

select * from t1; 
select * from t2; 
select * from t3; 

insert into t1 values (101, 'ABC'), (102, 'DEF'), (103, 'GHI'), (104, 'JKL'), (105, 'ABC'), (106, 'DEF'), (107, 'GHI'), (108, 'JKL'); 

insert into t2 values (101, 102, 103, 'Val'), (105, 106, 107, 'Mil'); 

insert into t3 values (104, 'Message1'), (108, 'Messgage2'); 

-

запрос с объяснением будет высоко оценен.

спасибо.

+0

вы можете использовать * Case * Синтаксис: http://dev.mysql.com/doc/refman/5.0/en /case.html –

+0

Вы хотите выбрать 't4.Message'? Нет таблицы 't4', поэтому, я думаю, вы имеете в виду' t3'. Но вы присоединяетесь только к 't3', когда' objectName' является 'JKL', что это должно быть иначе? – Barmar

+0

Любая таблица с тремя разными столбцами идентичности для объединения представляет собой плохой дизайн. – MatBailie

ответ

1

Использование UNION для объединения результатов каждого запроса:

SELECT t1.idObject, t1.objectName, t2.custName, NULL Message 
FROM t1 JOIN t2 ON (t1.idObject = t2.id1) 
WHERE t1.objectName = "ABC" 
UNION ALL 
SELECT t1.idObject, t1.objectName, NULL custName, NULL Message 
FROM t1 JOIN t2 ON (t1.idObject = t2.id2) 
WHERE t1.objectName = "DEF" 
UNION ALL 
SELECT t1.idObject, t1.objectName, NULL custName, NULL Message 
FROM t1 JOIN t2 ON (t1.idObject = t2.id3) 
WHERE t1.objectName = "GHI" 
UNION ALL 
SELECT t1.idObject, t1.objectName, NULL custName, Message 
FROM t1 join t3 ON (t1.idObject = t3.id4) 
WHERE t1.objectName = "JKL" 

Вы не упоминаете, но я предположил, Message должен быть NULL в ABC, DEF, случаи ГХОВ, так как нет такого столбца в t2 и custName должно быть NULL в корпусе JKL, потому что такого столбца нет в t3.

Чтобы заказать результат, вам нужно сделать UNION подзапрос:

SELECT * FROM (
    SELECT t1.idObject, t1.objectName, t2.custName, NULL Message 
    FROM t1 JOIN t2 ON (t1.idObject = t2.id1) 
    WHERE t1.objectName = "ABC" 
    UNION ALL 
    SELECT t1.idObject, t1.objectName, t2.custName, NULL Message 
    FROM t1 JOIN t2 ON (t1.idObject = t2.id2) 
    WHERE t1.objectName = "DEF" 
    UNION ALL 
    SELECT t1.idObject, t1.objectName, t2.custName, NULL Message 
    FROM t1 JOIN t2 ON (t1.idObject = t2.id3) 
    WHERE t1.objectName = "GHI" 
    UNION ALL 
    SELECT t1.idObject, t1.objectName, NULL custName, Message 
    FROM t1 join t3 ON (t1.idObject = t3.id4) 
    WHERE t1.objectName = "JKL") x 
ORDER BY idObject, custName, Message 
+0

'Выполнять плохо 'щедро, этот другой ответ дает совершенно глупые результаты. Этот, однако, получает +1 от меня :) – MatBailie

+0

в вышеуказанном требовании, если я удаляю «Кроме того, если t1.objectName является« DEF »или« GHI », я хочу, чтобы custName было нулевым в выборе результата». как бы выглядел запрос? не могли бы вы разместить сообщение ниже? – Rio

+0

Просто поместите 't2.custName' в те предложения SELECT, а не' NULL custName'. – Barmar

0

Идея SQL является то, что она позволяет сформулировать ваши точные требования в терминах SQL, например, так, например:

SELECT 
whatever you need, including 
CASE WHEN t1.objectName in ('DEF' , 'GHI') 
    THEN NULL 
    ELSE t2.custName 
END AS custName 
FROM 
t1, t2, t3 
WHERE 
(t1.objectName = 'ABC' AND t1.idObject = t2.id1) 
OR 
(t1.objectName = 'DEF' AND t1.idObject = t2.id2) 
OR 
... 

Я надеюсь, что вы можете расширить это на все ваши требования.

+0

Стоп! Вы на самом деле попробовали это? Представьте себе случай, когда 't1' и' t2' присоединяются успешно, *** КАЖДАЯ *** строка в 't3' теперь будет объединена с этим результатом ... Если вы попробуете это, вы увидите, что получите безумные результаты. – MatBailie

+0

Правильно. Это работало бы нормально, если бы проблема заключалась в том, чтобы решить, какой столбец в 't2' для соединения, но поскольку таблица для соединения также зависит от' objectName', она не работает правильно вообще. – Barmar

+0

в вышеуказанном требовании, если я удаляю «Кроме того, если t1.objectName является« DEF »или« GHI », я хочу, чтобы custName было нулевым в выборе результата». как бы выглядел запрос? не могли бы вы разместить сообщение ниже? – Rio