#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;