2013-03-02 3 views
0

У меня есть 3 таблицы, каждая из которых имеет всего 2 строки. T1 (идентификатор, имя), T2 (идентификатор, адрес электронной почты), T3 (идентификатор, телефон). T1 имеет регистрацию как на id1, так и на id2, T2 имеет регистрацию только на id1, на id2 нет регистрации (null) по электронной почте. T3 имеет регистрацию как для id1, так и для id2. Я хочу присоединиться к T1, T2 и T3 с некоторыми условиями (имя типа «% etc%»). Результатом должна быть таблица с (имя, адрес электронной почты, телефон), но если регистрация в одной из объединенных таблиц равна NULL (ex T2 id2 (email) равно NULL), я хочу, чтобы результат был таблицей только (name , телефон) (T1 + T3, потому что T2 имеет нулевую регистрацию при id2) ... какой-то вид на нескольких внутренних соединениях, если столбец имеет регистрацию не NULL. Спасибо.mysql присоедините несколько таблиц, если есть какая-либо регистрация

+0

Пожалуйста, покажите, что вы пробовали. – SilentAssassin

ответ

0

Я думаю, вы должны посмотреть в использовании LEFT JOINs:

SELECT T1.Name, T2.Email, T3.Phone 
FROM T1 
    LEFT JOIN T2 ON T1.id=T2.id 
    LEFT JOIN T3 ON T1.id=T3.id 

Это вернет все записи из таблицы T1, а только тех, которые удовлетворяют от Т2 и Т3. Другие поля будут NULL.

Если же вы хотите только те, которые соответствуют критериям, а затем использовать внутренние соединения вместо:

SELECT T1.Name, T2.Email, T3.Phone 
FROM T1 
    INNER JOIN T2 ON T1.id=T2.id 
    INNER JOIN T3 ON T1.id=T3.id 

Это будет возвращать только нужные записи.

Комментарий, который вы сделали только о возврате 2 столбцов, если одна запись NULL - я не думаю, что это подход, который вы хотите принять. Верните все свои столбцы и обработайте это на стороне презентации. Если вам действительно нужны динамические столбцы, вам нужно будет изучить Dynamic SQL.

--EDIT--

Динамический SQL подход:

SET @id = 2; 
SET @sql = NULL; 

SELECT 
    CONCAT(
     CASE WHEN EMail IS NOT NULL THEN 'Email' ELSE '' END, 
     CASE WHEN EMail IS NOT NULL AND Phone IS NOT NULL THEN ',' ELSE '' END, 
     CASE WHEN Phone IS NOT NULL THEN 'Phone' ELSE '' END) 
    INTO @sql 
FROM T1 
    LEFT JOIN T2 ON T1.id=T2.id 
    LEFT JOIN T3 ON T1.id=T3.id 
WHERE T1.Id = @id; 

SET @sql = CONCAT('SELECT Name, ', @sql, ' 
        FROM T1 
         LEFT JOIN T2 ON T1.id=T2.id 
         LEFT JOIN T3 ON T1.id=T3.id 
        WHERE T1.Id = ',@id); 

PREPARE stmt FROM @sql; 
EXECUTE stmt; 
DEALLOCATE PREPARE stmt; 

SQL Fiddle Demo

+1

* ... но если регистрация в одной из объединенных таблиц равна NULL (ex T2 id2 (email) равно NULL), я хочу, чтобы результат был только таблицей (имя, телефон) (T1 + T3, поскольку T2 имеет нулевая регистрация в id2) ... * - как это может возвратить два столбца, например? – Ambrose

+0

@MachoPaay - хороший момент, не совсем понял, о чем спрашивал OP. Я опубликую правку о возврате разных столбцов. – sgeddes

+0

в любом случае ваш ответ кажется прекрасным, поскольку вы не можете динамически возвращать неравный столбец за выполнение, если только OP не создаст динамический sql. – Ambrose

Смежные вопросы