Есть ли лучший способ сделать запрос к базе данных, чтобы проверить, есть ли какие-либо данные в базе данных в одной из таблиц между ними? - PullRequest
0 голосов
/ 27 июня 2019

Я хочу знать, есть ли какой-нибудь лучший способ запроса к базе данных, чтобы проверить, существуют ли какие-либо данные в некотором столбце в одной из двух таблиц.Сейчас я использую два запроса, чтобы проверить, существуют ли данные, но я твердо верю, что есть какой-то способ.Пример: у меня есть две таблицы в MySQL - поставщики и пользователи.Мне нужно проверить, существует ли имя пользователя в таблице поставщиков или в таблице пользователей, и если нет, разрешить клиенту (не путайте, клиент здесь означает, что клиент выполняет действия в браузере) использовать имя пользователя.Предположим, у меня есть два столбца в обеих таблицах:

Таблица поставщиков: supplier_id, supplier_username

Таблица пользователей: user_id, user_username

В настоящее время я два раза запрашиваю базу данныхпроверьте, доступно ли имя пользователя для использования.

SELECT supplier_id FROM suppliers WHERE supplier_username = ?

Как только я получу данные, и если будет 0 строк, то сделайте то же самое для таблицы пользователей, и снова, если я получу 0 строк, тогда имя пользователядоступно.

Имя пользователя должно быть уникальным.

Мне нужно, если есть лучший способ (возможно, один запрос), чтобы узнать, доступно ли имя пользователя для использования.

Спасибозаранее!

Ответы [ 3 ]

0 голосов
/ 27 июня 2019

Ограничение при объединении таблиц заключается в том, что данные из одной таблицы всегда зависят от данных из другой таблицы. Чтобы ссылаться на каждую таблицу как на собственный набор данных, вы можете использовать UNION для объединения списков.

SELECT supplier_id as id, supplier_username as name FROM suppliers WHERE supplier_username = '?'
UNION 
SELECT user_id, user_username FROM users WHERE user_username = '?'

Или вы можете сделать еще один шаг, используя оператор Select union в качестве предложения From, разрешающий порядок сортировки, критерии частичного поиска и т. Д.

SELECT c.id, c.name 
from (SELECT s.supplier_id as id, s.supplier_username as name FROM suppliers as s
UNION 
SELECT u.user_id as id, u.user_username as name FROM users as u) as c
WHERE c.name like '%?%'
Order by c.name 
0 голосов
/ 27 июня 2019

Существует несколько возможных шаблонов запросов.

Оператор набора UNION ALL может объединять результаты двух SELECT, каждый из которых должен возвращать одинаковое количество столбцов и столбцов одинаковых типов данных. Мы часто включаем дополнительный столбец дискриминатора, который сообщает нам, какой SELECT возвратил какую строку.

Например:

( SELECT 's' AS src
       , s.supplier_id  AS id
    FROM suppliers s
   WHERE s.supplier_username = ?
)
UNION ALL 
( SELECT 'u' AS src
       , u.user_id
    FROM users u
   WHERE u.user_username = ?
)

Другая альтернатива, если нам не нужно извлекать значение id, а просто нужно получить счетчик количества строк с совпадающим supplier_username / user_username, то n, мы могли бы сделать что-то вроде это:

SELECT COUNT(DISTINCT s.supplier_id) + COUNT(DISTINCT u.user_id) AS cnt
  FROM ( SELECT 1 AS n ) i
  LEFT
  JOIN suppliers s
    ON s.supplier_username = ?
  LEFT
  JOIN users u
    ON u.user_username = ?
0 голосов
/ 27 июня 2019

сделать внутреннее соединение. Если возвращается 0, он скажет вам, что запись не существует в обеих таблицах:

SELECT COUNT(*)
FROM suppliers s
INNER JOIN users u
ON s.supplier_username = u.user_username
WHERE u.user_username = @username
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...