Выбор ВСЕХ данных из двух разных таблиц

#mysql #sql #select

#mysql #sql #выберите

Вопрос:

Я хочу отобразить запрещенных пользователей и IP-адреса, но они находятся в двух разных таблицах. У меня есть таблица для пользователей веб-сайта, и эта таблица содержит столбец «запрет» и другую таблицу для запрещенных IP-адресов. Итак, я хочу что-то вроде этого:

ВЫБЕРИТЕ

ipban.ip, ipban.admin, ipban.reason

И

users.username ГДЕ ban=1

(Этот запрос неверен, я написал это просто для объяснения моей проблемы)

А затем отобразите это в таблице. Итак, как это сделать?

Комментарии:

1. Используйте ВНУТРЕННЕЕ СОЕДИНЕНИЕ в общем поле. ВЫБЕРИТЕ * ИЗ user INNER JOIN ip НА users.field = ip.field ГДЕ users.ban = 1 или что-то в этом роде.

2. Есть ли какая-либо связь между этими 2 таблицами или они взаимоисключающие?

3. Пожалуйста, добавьте информацию о схеме обеих таблиц в свой вопрос. Для соединения этих двух таблиц должен быть столбец, например, имеющий user_id в таблице ips. ИЛИ же ваша схема базы данных объясняет вашу систему таким образом, что пользователь может быть забанен ИЛИ IP может быть забанен. В этом случае таблица отображения, которую вы пытаетесь создать, неинформативна.

4. Эти две таблицы не связаны, в них нет полей, которые могут совпадать.

5. Взгляните на ответ Эланхи, вам нужно ОБЪЕДИНЕНИЕ

Ответ №1:

Используйте ОБЪЕДИНЕНИЕ, что-то вроде этого:

 (SELECT NULL, ipban.ip, ipban.admin, ipban.reason FROM ipban)
UNION ALL
(SELECT users.username,NULL,NULL,NULL FROM users WHERE ban=1)
 

Я предполагаю, что у этих двух таблиц нет общего поля для объединения.

Комментарии:

1. Это действительно сработало, хотя я уже пробовал подобный запрос раньше. Спасибо!

Ответ №2:

 SELECT ipban.ip, ipban.admin, ipban.reason, users.username FROM ip, users WHERE users.somekey = ipban.somekey and users.ban = 1
 

Предположение ban есть в users таблице.

Вы также можете соединить таблицы с помощью ВНУТРЕННЕГО СОЕДИНЕНИЯ:

 SELECT ipban.ip, ipban.admin, ipban.reason, users.username FROM users INNER JOIN ip ON users.somekey = ip.somekey WHERE users.ban = 1
 

Чтобы получить все столбцы из обеих таблиц, используйте

 SELECT * FROM users INNER JOIN ip ON users.somekey = ip.somekey WHERE users.ban = 1
 

Комментарии:

1. Просто чтобы упомянуть, что эти две таблицы не связаны и не имеют совпадающих полей.

2. Если таблицы не связаны, то использование ОБЪЕДИНЕНИЯ для получения полного списка не является хорошим решением. Рассмотрите возможность наличия двух запросов. Если пользователь был найден в таблице users, вам не нужно проверять таблицы ip и наоборот. Использование ОБЪЕДИНЕНИЯ также не даст вам индекс, и по мере роста вашей базы данных этот запрос будет выполняться все медленнее и медленнее.

3. ОБЪЕДИНЕНИЕ работает, но я разделил его на два запроса в двух вкладках на странице. И, кстати, таблица users предназначена только для зарегистрированных пользователей без каких-либо IP-адресов, а таблица ipban предназначена для пользователей, которые не зарегистрированы и не имеют имени пользователя, но они делают то, что они не должны делать на веб-сайте. Итак, таблицы ip и users не связаны, и если пользователь забанен, его нет в таблице ipban. В любом случае спасибо.

Ответ №3:

Выберите ipban.ip,ipban.admin,ipban.reason,users.username из ipban Inner Присоединиться к пользователям по общему атрибуту (здесь вы должны указать столбец, который есть в обеих таблицах), где ban=1;