3 Table Join в MySQL - PullRequest
       2

3 Table Join в MySQL

2 голосов
/ 18 февраля 2010

Скажите, у меня есть 3 таблицы. Таблица1 содержит client_id и client_name. Таблица2 содержит client_id, client_catid_1 и client_catid_2. Эти таблицы объединяются на основе client_id. Теперь третья таблица, содержит category_id и category_name. Как можно присоединиться к третьей таблице на основе идентификаторов категорий и получить имя_категории? Пример:

Таблица 1:

client_id | client_name
-----------------------
121231231 | Some name
345234666 | Another Name
-----------------------

Таблица 2:

client_id | client_catid_1 | client_catid_2
-------------------------------------------
121231231 | 22             | 79
345234666 | 34             | 566
------------------------------------------

Таблица 3:

category_id | category_name
----------------------------
22          | category 22
34          | category 34
79          | category 79
566         | category 566
----------------------------

Тогда вывод:

client_id | client_name | client_cat1 | client_cat2
---------------------------------------------------
121231231 | Some name   | category 22 | category 79
345234666 | Another     | category 34 | category 566
---------------------------------------------------

И текущий запрос:

SELECT client.*,
cat1id.client_catid_1 as cat1,
cat2id.client_catid_2 as cat2
FROM tb_clients AS client
LEFT JOIN tb_clients_categories cat1id ON client.client_id = cat1id.client_id
LEFT JOIN tb_clients_categories cat2id ON client.client_id = cat2id.client_id
WHERE client.client_id = 65447

Кроме того, я не спрашиваю о нормализации или дизайне базы данных. Я говорю это только потому, что люди, как правило, пропускают ваш вопрос и начинают пытаться информировать вас о лучшем дизайне базы данных. Это я поняла. Я работаю с чем-то, что я изначально не собирал, и смена БД - не вариант!

Заранее спасибо!

Ответы [ 3 ]

5 голосов
/ 18 февраля 2010

Использование:

   SELECT a.client_id,
          a.client_name,
          c1.category_name AS client_cat1,
          c2.category_name AS client_cat2
     FROM tb_clients a
LEFT JOIN tb_clients_categories b ON b.client_id = a.client_id
LEFT JOIN TABLE C c1 ON c1.category_id = b.client_catid_1
LEFT JOIN TABLE C c2 ON c2.category_id = b.client_catid_2
    WHERE c1.category_name = 'Something' 
       -- because you can't refer to a column (client_cat1) alias in the WHERE

Это даст вам список клиентов и, при необходимости, их имена категорий.Если связь между tb_clients_categories и tb_clients не существует, имя клиента все равно будет отображаться, а client_cat1 и client_cat2 будут иметь значение NULL.Если вы не хотите этого, удалите ключевое слово LEFT в JOIN только для клиентов с двумя категориями, которые должны отображаться в выходных данных.

1 голос
/ 18 февраля 2010
SELECT client.*,
cat1id.client_catid_1 as cat1,
cat1id.client_catid_2 as cat2,
cat1.category_name,
cat2.category_name
FROM tb_clients AS client
LEFT JOIN tb_clients_categories cat1id ON client.client_id = cat1id.client_id
LEFT JOIN category cat1 ON category.cat_id = cat1id.client_catid_1
LEFT JOIN category cat2 ON category.cat_id = cat2id.client_catid_2
WHERE client.client_id = 65447
0 голосов
/ 18 февраля 2010

A LEFT JOIN оператор может содержать любой фильтр.Используйте OR в предложении объединения, и вам не нужно повторять первую таблицу .:

SELECT client.*,
  cats.category_id AS client_catid
FROM tb_clients AS client
  LEFT JOIN tb_clients_categories cat1id ON client.client_id = cat1id.client_id
  LEFT JOIN tb_categories cats ON 
    (cats.category_id = cat1id.client_cat1 OR 
     cats.category_id = cat1id.client_cat2)
WHERE client.client_id = 65447
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...