我有一个这种格式的表
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 |
我想要做的是搜索一个名称,找出该名称已分配的ips,并搜索包含该逗号分隔的IP列表中至少一个值的名称。我遇到的问题是它是一个以逗号分隔的列表。
到目前为止,我在bash中所做的是(省略不必要的部分):
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个查询。另一个问题是格式化,我想只使用--table格式化一个结果。 第三个问题是看到我重复的结果,我也无法重新搜索每个结果(再次为至少有一个共享ip的用户搜索每个结果)
任何对正确道路的暗示都将受到赞赏。非常感谢你!
答案 0 :(得分: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 ;
在此处,您可以通过左连接访问您的用户帐户信息及其登录信息。
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`;