【问题标题】:MySQL comma separated field queryMySQL逗号分隔字段查询
【发布时间】:2013-08-14 01:55:54
【问题描述】:

我有一张这种格式的表格

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,然后搜索至少包含该逗号分隔的 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 的用户)

任何关于正确路径的提示将不胜感激。非常感谢!

【问题讨论】:

    标签: mysql list comma


    【解决方案1】:

    至于优化,你可以通过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`;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-18
      • 1970-01-01
      • 2013-05-31
      • 1970-01-01
      • 2014-02-18
      • 1970-01-01
      相关资源
      最近更新 更多