2009-12-24 3 views
10

У меня есть таблица, которая использует 3 внешних ключа в других таблицах. Когда я выполняю левое соединение, я получаю повторяющиеся столбцы. MySQL говорит, что синтаксис USING уменьшит повторяющиеся столбцы, но примеров для нескольких ключей нет.MySQL: удаление дубликатов столбцов на Left Join, 3 таблицы

Дано:

mysql> describe recipes; 
+------------------+------------------+------+-----+---------+-------+ 
| Field   | Type    | Null | Key | Default | Extra | 
+------------------+------------------+------+-----+---------+-------+ 
| ID_Recipe  | int(11)   | NO | PRI | NULL |  | 
| Recipe_Title  | char(64)   | NO |  | NULL |  | 
| Difficulty  | int(10) unsigned | NO |  | NULL |  | 
| Elegance   | int(10) unsigned | NO |  | NULL |  | 
| Quality   | int(10) unsigned | NO |  | NULL |  | 
| Kitchen_Hours | int(10) unsigned | NO |  | NULL |  | 
| Kitchen_Minutes | int(10) unsigned | NO |  | NULL |  | 
| Total_Hours  | int(10) unsigned | NO |  | NULL |  | 
| Total_Minutes | int(10) unsigned | NO |  | NULL |  | 
| Serving_Quantity | int(10) unsigned | NO |  | NULL |  | 
| Description  | varchar(128)  | NO |  | NULL |  | 
| ID_Prep_Text  | int(11)   | YES |  | NULL |  | 
| ID_Picture  | int(11)   | YES |  | NULL |  | 
| Category   | int(10) unsigned | NO |  | NULL |  | 
| ID_Reference  | int(11)   | YES |  | NULL |  | 
+------------------+------------------+------+-----+---------+-------+ 
15 rows in set (0.06 sec) 

mysql> describe recipe_prep_texts; 
+------------------+---------------+------+-----+---------+-------+ 
| Field   | Type   | Null | Key | Default | Extra | 
+------------------+---------------+------+-----+---------+-------+ 
| ID_Prep_Text  | int(11)  | NO | PRI | NULL |  | 
| Preparation_Text | varchar(2048) | NO |  | NULL |  | 
+------------------+---------------+------+-----+---------+-------+ 
2 rows in set (0.02 sec) 

mysql> describe recipe_prep_texts; 
+------------------+---------------+------+-----+---------+-------+ 
| Field   | Type   | Null | Key | Default | Extra | 
+------------------+---------------+------+-----+---------+-------+ 
| ID_Prep_Text  | int(11)  | NO | PRI | NULL |  | 
| Preparation_Text | varchar(2048) | NO |  | NULL |  | 
+------------------+---------------+------+-----+---------+-------+ 
2 rows in set (0.02 sec) 

mysql> describe mp_references; 
+--------------+---------+------+-----+---------+-------+ 
| Field  | Type | Null | Key | Default | Extra | 
+--------------+---------+------+-----+---------+-------+ 
| ID_Reference | int(11) | NO | PRI | NULL |  | 
| ID_Title  | int(11) | YES |  | NULL |  | 
| ID_Category | int(11) | YES |  | NULL |  | 
+--------------+---------+------+-----+---------+-------+ 
3 rows in set (0.00 sec) 

Мое заявление запрос:

SELECT * 
FROM Recipes 
LEFT JOIN (Recipe_Prep_Texts, Recipe_Pictures, mp_References) 
ON (
Recipe_Prep_Texts.ID_Prep_Text = Recipes.ID_Prep_Text AND 
Recipe_Pictures.ID_Picture = Recipes.ID_Picture AND 
mp_References.ID_Reference = Recipes.ID_Reference 
); 

Моя цель состоит в том, чтобы получить одну строку все столбцы из объединения без дублированных столбцов. Я использую MySQL C++ Connector для отправки инструкций SQL и получения наборов результатов. Я считаю, что C++ Connector имеет проблемы с дублирующимися именами столбцов.

Итак, что такое синтаксис SQL-инструкции, который я должен использовать?

Reference to MySQL JOIN syntax

ответ

13

Я считаю, что должно работать:

SELECT * 
FROM Recipes 
LEFT JOIN Recipe_Prep_Texts USING (ID_Prep_Text) 
LEFT JOIN Recipe_Pictures USING (ID_Picture) 
LEFT JOIN mp_References USING (ID_Reference) 
+2

Это работает, за исключением случаев, когда таблица не существует. Поэтому я поставил чеки на это. Кроме того, это предполагает, что таблицы имеют уникальные имена столбцов, за исключением полей внешнего ключа. К счастью, это то, что у меня есть. **Большое спасибо!** –

2

Вы выбираете * от объединенной итоговой таблицы. Ограничьте это * любыми столбцами, которые вы хотите сохранить.

+1

Как вы смотрите в почтовых данных MySQL, у меня есть много столбцов. Это может быть больно, если мне нужно перечислить все столбцы, кроме дубликатов. Есть ли спецификатор SQL, который позволит мне перечислить все столбцы, кроме тех, которые я указываю? –

+0

Не знаю, о чем я знаю. – tgandrews

4

Поскольку это выглядит как большинство таблиц вы вступающие на есть несколько столбцов для первого, за исключением, как насчет:

SELECT Recipes.*, 
      Recipe_Prep_Texts.Preparation_Text, 
      Recipe_Pictures.Foo, -- describe is missing in OP 
      mp_References.ID_Title, 
      mp_References.ID_Category 

    FROM Recipes 
LEFT JOIN (Recipe_Prep_Texts, Recipe_Pictures, mp_References) 
     ON (
      Recipe_Prep_Texts.ID_Prep_Text = Recipes.ID_Prep_Text AND 
      Recipe_Pictures.ID_Picture = Recipes.ID_Picture AND 
      mp_References.ID_Reference = Recipes.ID_Reference 
     ); 

Я не могу сказать вам, сколько раз я хотел, чтобы я имел

SELECT (* - foo) FROM table 

особенно в тех случаях, когда foo - это какое-то огромное поле, такое как BLOB, и я просто хочу увидеть все остальное, не нарушая форматирование.

+2

Хотя перечисление каждого допустимого столбца возможно, я просто думаю, что это большая работа для моей программы, а также добавляет длину инструкции SQL, которая отправляется в базу данных. См. Ответ Дэнни ниже. –

0

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

SELECT name,ac,relation_name 
FROM table1 
LEFT JOIN table2 USING (ID_Prep_Text) 
LEFT JOIN table3 USING (ID_Picture); 
Смежные вопросы