MySQL присоединиться для этого конкретного сценария - PullRequest
0 голосов
/ 17 марта 2009

У меня проблема с соединениями MySQL.

Table_A * * 1004 A_id Cost1 A1_id Cost2 1 500 0 200 1 100 1 100 1 50 2 60 1 10 3 50 2 5 0 10 Table_B (относится B_id: от Table_A A1_id):

 B_id  FName  LName
 1     X      A
 2     Y      B
 3     Z      C

Table_C (относится C_id: от Table_A A_id):

C_id  Towns

 1    Atlanta
 2    NewYork

Мне нужно объединить все три таблицы, как показано ниже:

  • Я извлекаю Towns, которые соответствуют (Table_A.A_id=Table_C.C_id).
  • Я извлекаю Fname, Lname, которые соответствуют (table_A.A1_id=Table_b.b_id).
  • Мне нужно пропустить Towns, если A1_id != 0.
  • Мне нужно пропустить Fname, Lname, если A1_id == 0.

Остальные данные могут быть либо значением, либо нулем, которое я указываю как '#'. Каким будет эффективный запрос MySQL для данного сценария?

Выход:

A_id  Cost1  A1_id cost2 Fname Lname Towns
1     500     0    200    #     #    Atlanta
1     100     1    100    X     A     #
1      50     2     60    Y     B     #
1      10     3     50    Z     C     #

Ответы [ 3 ]

6 голосов
/ 17 марта 2009

Я думаю, что это должно быть что-то вроде этого.

select A_id, Cost1,  A1_id, cost2, Fname, Lname, Towns
from Table_A
left join Table_B on table_A.A1_id = Table_b.b_id
left join Table_C on Table_A.A_id  = Table_C.C_id
1 голос
/ 17 марта 2009

Это похоже на СОЮЗ двух разных запросов ко мне. Я предполагаю, что столбцы идентификаторов никогда не содержат отрицательных значений.

SELECT A.A_id, A.Cost1, A.A1_id, A.Cost2, B.Fname, B.Lname, C.Town
    FROM Table_A AS A
              INNER JOIN Table_B AS B ON A.A1_id = B.B_id
         LEFT OUTER JOIN Table_C AS C ON A.A_id  = C.C_id
    WHERE A.A1_id != 0
      AND C.C_id < 0
UNION
SELECT A.A_id, A.Cost1, A.A1_id, A.Cost2, B.Fname, B.Lname, C.Town
    FROM Table_A AS A
         LEFT OUTER JOIN Table_B AS B ON A.A1_id = B.B_id
              INNER JOIN Table_C AS C ON A.A_id  = C.C_id
    WHERE A.A1_id = 0
      AND B.B_id < 0;

Я не совсем уверен в этой формулировке. Существует вероятность того, что условия для B.B_id <0 и C.C_id <0 необходимо связать с соответствующими предложениями ON. </p>

Существует также хороший шанс, что использование двух левых внешних объединений в одном SELECT с соответствующими фильтрами OR приведет к правильному результату.

0 голосов
/ 17 марта 2009

Если я правильно понимаю, это должно быть:

select fname, lname, towns
from table_a, table_b table_c
where table_a.a_id = table_c.c_id
  and table_a.a1_id = table_b.b_id
  and table_a.a1_id <> 0;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...