Как мне объединить несколько таблиц в одну с MySQL? - PullRequest
0 голосов
/ 15 сентября 2011

У меня есть три таблицы (deb, dos, char), и я ищу SQL-запрос для получения таблицы result, как показано ниже:

table: deb
+----+-------------+--------+
| id | label       | dos_id |
+----+-------------+--------+
|  1 | right       |      1 | 
|  2 | left        |      2 | 
+----+-------------+--------+

table:char
+----+-------------+--------+
| id | name        | dos_id |
+----+-------------+--------+
|  1 | jack        |      1 | 
|  2 | thaw        |      1 |
|  3 | lbaz        |      2 |
|  4 | amar        |      3 |
+----+-------------+--------+

table:dos
+----+-------------+
| id | color       |
+----+-------------+
|  1 | black       | 
|  2 | white       |
+----+-------------+


result table
+----+-------------+--------+
| id | color       | value  |
+----+-------------+--------+
|  1 | black       |  right | 
|  1 | black       |  jack  |
|  1 | black       |  thaw  |
|  2 | white       |  left  |
|  2 | white       |  lbaz  |
|  2 | white       |  amar  |
+----+-------------+--------+

Я пытался соединиться влево и вправо, но это не сработало.

Что я ищу, так это то, что для каждой строки dos я получаю соответствующие значения char и deb в другом столбце.

Может быть, может помочь создание запроса выбора строки в одном. Я не знаю.

Пожалуйста, помогите мне и спасибо.

Ответы [ 3 ]

1 голос
/ 15 сентября 2011

Вам нужно выполнить 2 отдельных запроса и объединить результаты в один набор результатов. Вы можете сделать это с помощью оператора UNION следующим образом:

SELECT * FROM 
(
  SELECT dos.id id, dos.color color, deb.label value
  FROM dos INNER JOIN deb on dos.id = deb.dos_id
  UNION
  SELECT dos.id id, dos.color color, char.name value
  FROM dos INNER JOIN char on dos.id = char.dos_id
)
ORDER BY id

EDIT:

SELECT * 
FROM 
( 
  SELECT dos.id AS id, dos.date_facture AS facture, deb.libelle AS lbl, '' AS nom
  AS lbl FROM jos_tktransit_dossier dos INNER JOIN jos_tktransit_deboure deb ON dos.id = deb.id_dossier 
  UNION 
  SELECT dos.id AS id, dos.date_facture AS facture, '' AS lbl, charg.nom_charge AS nom 
  FROM jos_tktransit_dossier dos INNER JOIN jos_tktransit_charge_assistance charg ON dos.id = charg.id_dossier 
) 
0 голосов
/ 17 сентября 2011

Попробуйте следующее:

(select d.id,d.color,c.name from dos d , char1 c where d.id=c.dos_id) union (select d.id,d.color,e.label from dos d, deb e where d.id= e.dos_id)

Это должно вывести следующее:

ID  COLOR   NAME
1   black   jack
1   black   right
1   black   thaw
2   white   lbaz
2   white   left

... но он не показывает значения в правильном порядке:

+----+-------------+--------+
| id | color       | value  |
+----+-------------+--------+
|  1 | black       |  right | 
|  1 | black       |  jack  |
|  1 | black       |  thaw  |
|  2 | white       |  left  |
|  2 | white       |  lbaz  |
| *2 | white       |  amar* |
+----+-------------+--------+
0 голосов
/ 15 сентября 2011

Может быть что-то вроде:

SELECT dos.id, color, deb.label as value  FROM dos, deb WHERE dos_id = dos.id
UNION SELECT dos.id, color, char.name as value FROM dos, char WHERE dos_id = dos.id;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...