MySQL ПРИСОЕДИНЯЙТЕСЬ или ИСПОЛЬЗУЙТЕ?

Таблицы базы данных

Чтобы продемонстрировать, как работают предложения USING и ON, давайте предположим, что у нас есть следующие таблицы базы данных post и post_comment , которые формируют связь один ко многим через столбец внешнего ключа post_id в таблице post_comment , ссылающейся на столбец первичного ключа post_id в таблице post :

Родительская таблица post имеет 3 строки:

 | post_id | название |
|---------|-----------|
| 1 | Ява |
| 2 | Спящий режим |
| 3 | JPA |
 

и дочерняя таблица post_comment имеет 3 записи:

 | post_comment_id | обзор | post_id |
|-----------------|------------|---------|
| 1 | Хорошо | 1 |
| 2 | Отлично | 1 |
| 3 | Потрясающе | 2 |
 

Предложение JOIN ON с использованием пользовательской проекции

Традиционно при написании запроса INNER JOIN или LEFT JOIN мы используем предложение ON для определения условия соединения.

Например, чтобы получить комментарии вместе с соответствующим названием сообщения и идентификатором, мы можем использовать следующий запрос проекции SQL:

 SELECT
   пост.post_id,
   заголовок,
   обзор
ОТ поста
ВНУТРЕННЕЕ СОЕДИНЕНИЕ post_comment ON post.post_id = post_comment.post_id
ЗАКАЗАТЬ ПО post.post_id, post_comment_id
 

И мы получаем следующий набор результатов:

 | post_id | название | обзор |
|---------|------------|-----------|
| 1 | Ява | Хорошо |
| 1 | Ява | Отлично |
| 2 | Спящий режим | Потрясающе |
 

Предложение JOIN USING с использованием пользовательской проекции

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

 SELECT
  post_id,
  заголовок,
  обзор
ОТ поста
ВНУТРЕННЕЕ СОЕДИНЕНИЕ post_comment ИСПОЛЬЗОВАНИЕ(post_id)
ЗАКАЗАТЬ ПО post_id, post_comment_id
 

Набор результатов для этого конкретного запроса идентичен предыдущему SQL-запросу, в котором использовалось предложение ON:

 | post_id | название | обзор |
|---------|------------|-----------|
| 1 | Ява | Хорошо |
| 1 | Ява | Отлично |
| 2 | Спящий режим | Потрясающе |
 

Предложение USING работает для Oracle, PostgreSQL, MySQL и MariaDB. SQL Server не поддерживает предложение USING, поэтому вместо него необходимо использовать предложение ON.

Предложение USING можно использовать с операторами INNER, LEFT, RIGHT и FULL JOIN.

Предложение SQL JOIN ON с

SELECT *

Теперь, если мы изменим предыдущий запрос предложения ON, чтобы выбрать все столбцы, используя SELECT * :

 SELECT *
ОТ поста
ВНУТРЕННЕЕ СОЕДИНЕНИЕ post_comment ON post.post_id = post_comment.post_id
ЗАКАЗАТЬ ПО post.post_id, post_comment_id
 

Мы получим следующий результирующий набор:

 | post_id | название | post_comment_id | обзор | post_id |
|---------|------------|-----------------|--------- --|---------|
| 1 | Ява | 1 | Хорошо | 1 |
| 1 | Ява | 2 | Отлично | 1 |
| 2 | Спящий режим | 3 | Потрясающе | 2 |
 

Как видите, post_id — это дубликат , потому что обе таблицы post и post_comment содержат столбец post_id .

Предложение SQL JOIN USING с

SELECT *

С другой стороны, если мы запустим запрос SELECT * , содержащий предложение USING для условия JOIN:

 SELECT *
ОТ поста
ВНУТРЕННЕЕ СОЕДИНЕНИЕ post_comment ИСПОЛЬЗОВАНИЕ(post_id)
ЗАКАЗАТЬ ПО post_id, post_comment_id
 

Мы получим следующий результирующий набор:

 | post_id | название | post_comment_id | обзор |
|---------|------------|-----------------|--------- --|
| 1 | Ява | 1 | Хорошо |
| 1 | Ява | 2 | Отлично |
| 2 | Спящий режим | 3 | Потрясающе |
 

Вы видите, что на этот раз столбец post_id дедуплицирован, поэтому в результирующий набор включен один столбец post_id .

Заключение

Если схема базы данных разработана таким образом, что имена столбцов внешнего ключа соответствуют столбцам, на которые они ссылаются, и условия ПРИСОЕДИНЕНИЯ проверяют только, равно ли значение столбца внешнего ключа значению его зеркального столбца в другой таблице, то вы можете использовать предложение USING.

В противном случае, если имя столбца внешнего ключа отличается от ссылочного столбца или вы хотите включить более сложное условие соединения, вместо этого следует использовать предложение ON.

Запрос на присоединение к MySQL с использованием лайка?

спросил

Изменено 3 года, 10 месяцев назад

Просмотрено 59 тысяч раз

Я уже давно пытаюсь заставить это работать, но это просто не работает, может быть, это даже невозможно, я хочу выполнить запрос на соединение MySQL, используя, например, как этот пример я нашел…

 ВЫБЕРИТЕ *
ИЗ Таблицы1
INNER JOIN Table2 ON Table1.col LIKE '%' + Table2.col + '%'
 

, но, похоже, это вообще не работает, любая помощь, которая может быть оказана, была бы блестящей, спасибо!

  • mysql
  • join
  • sql-подобный

Попробуйте

 SELECT *
ИЗ Таблицы1
INNER JOIN Table2 ON Table1. col LIKE CONCAT('%', Table2.col, '%')
 

MySQL выполняет конкатенацию строк не так, как другие базы данных, поэтому, если вы хотите перенести свое приложение, вам нужна альтернативная версия, где

|| используется как оператор конкатенации, как упоминал Майкл в другом ответе. Однако этот оператор не работает в MySQL, так как он означает или .

2

Как насчет этого вместо этого:

 SELECT * FROM Table1, Table2 WHERE Table1.col LIKE '%'+Table2.col+'%';
 

Поскольку вы все равно выбираете все из обеих таблиц, это, вероятно, приведет вас туда.

0

 ВЫБРАТЬ p.products_id, pd.products_name, p.products_model
ИЗ product_description pd
ПРИСОЕДИНЯЙТЕСЬ к продуктам p ON p.products_id = pd.products_id
ГДЕ pd.products_name LIKE CONCAT ('%', p.products_model, '%')
ПРЕДЕЛ 0 , 100
 

Во-первых, вы должны ограничить свой запрос (p.