2013-08-14 4 views
0

У меня есть таблица с этим форматомMySQL разделенные запятой поля запроса

name char 
password char 
ips char 
lastAction timestamp 

Пример:

SELECT * FROM XXXX LIMIT 0,1; 

| name | password    |  ips         | lastAction   | 
| Dixon | encripted password here | 190.31.xx.xxx,201.252.xx.xxx,190.137.xx.xxx | 2013-08-03 14:27:38 | 

То, что я хочу сделать, это найти имя, узнать ИПС, что имя присвоенные и поиск имен, содержащих хотя бы одно значение этого списка разделенных запятыми списков IP-адресов. Проблема, с которой я сталкиваюсь, состоит в том, что это список, разделенный запятыми.

Что я сделал в Баш до сих пор (опуская unnecesary части):

mysql -h host -uroot -ppassword database -e "SELECT ips FROM crazylogin_accounts WHERE name = '$nombre'" > multi.log 
cat multi.log | tr ',' '\n' > ip.log 
cat multi.log | sed 's/,/ /g' | tr ' ' '\n' > ip.log 
while read line 
do 
    mysql --table -h host -uroot -ppassword database -e "SELECT name as Nombre, lastAction as UltimaAccion FROM xxxxx WHERE ips like '%$line%'" >> user.log 
done < ip.log 

Проблема с этим состоит в том, что он не оптимизирован вообще. Некоторые пользователи имеют около 10 значений или более, и это генерирует 10 запросов. Другая проблема - форматирование, я хотел иметь только один результат, созданный с использованием таблицы. И третья проблема заключалась бы в том, что, видя, что, повторяя результаты, я не смог бы повторного поиска каждого результата (поиск каждого результата снова для пользователей с хотя бы одним общим ip)

Любые намеки на право путь будет оценен. Большое спасибо!

ответ

2

Что касается оптимизации, вы можете решить эту проблему: normalizing ваших таблиц.

Таблица Пользователь

CREATE TABLE IF NOT EXISTS `users` (
    `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT, 
    `name` varchar(32) NOT NULL, 
    `password` varchar(123) NOT NULL, 
    `lastaction` date NOT NULL, 
    PRIMARY KEY (`id`), 
    UNIQUE KEY `name` (`name`) 
) ENGINE=InnoDB AUTO_INCREMENT=1 ; 

Войти стол

CREATE TABLE IF NOT EXISTS `ips` (
    `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT, 
    `ipaddress` varchar(32) NOT NULL, 
    PRIMARY KEY (`id`), 
) ENGINE=InnoDB AUTO_INCREMENT=1 ; 

Отсюда вы можете получить доступ к получить доступ к информации учетной записи ваших пользователей и их входа в систему IP-адреса через соединения слева.

SELECT 
    u.id as user_id, 
    u.name as user_name, 
    u.password as user_password, 
    u.lastaction as user_lastaction, 
    i.ipaddress as ipaddress 
FROM users as u 
LEFT JOIN ips as i ON i.id = u.id 
WHERE user_name = `bob`; 
Смежные вопросы