从数据库表中全选——但在其中一列上使用函数

Posted

技术标签:

【中文标题】从数据库表中全选——但在其中一列上使用函数【英文标题】:Select all from database table – but use a function on one of the columns 【发布时间】:2016-01-19 05:55:10 【问题描述】:

这甚至可能吗,我这个问题的标题有意义吗?

我正在努力寻找从数据库table 获取所有内容的方法,但我需要运行 SQL 或 php 函数。

所以真正简短的例子是:

SELECT * FROM `table` WHERE `ip` = '$this->ip'

但是我使用INET_ATON() 来存储IPINET_NTOA() 以将其取回。我也可以使用 PHP 的函数 ip2long()long2ip(),但我仍然不知道如何使用相同的 查询 来完成这样的事情?

SELECT `id`, INET_NTOA(`ip`) as `ip`, `points`
FROM `table` WHERE `ip` = INET_ATON('$this->ip')

这些都是手动定义的table columns,以达到我需要做的事情的目的。但是...对于这个简单的项目,这样做似乎没问题,但是如果我有更多的列并且只有其中一些或其中一个需要一些转换怎么办?

那么我怎样才能完成类似... (我知道这是无效的)

SELECT * FROM `table` WHERE `ip` = '$this->ip` BUT INET_NTOA(`ip`) as `ip`

除了这个问题,我还想知道INET_ATON() & INET_NTOA()是否只有mysql functionSQL功能。因为我打算重写我的项目以使用PDO 而不是MySQLi,我不确定这些函数是否可以工作,或者我应该依赖 PHP 的内置相同功能。

【问题讨论】:

为什么要在每次执行选择查询时都应用该功能?你不能将计算的东西存储在同一列而不是 IP 或不同列中的 DB 中吗? @ynos1234 – 你能向我描述一下吗?对于每个visitor,我只使用一次该查询。我阅读了 *** 的一个问题 - 使用此 INET_ATON 函数将 IP 存储为 INT UNSIGNED 比不转换 IP 并将其存储在 VARCHAR(15) 中要好得多。所以我正在努力遵循最佳实践,对吗? 我认为INET_ATON() & INET_NTOA() 只存在于 mysql 中。如果你想在 SQL 中使用它,你应该使用 SQL 函数:***.com/questions/1270855/…。通过将 IP 存储为 UNSIGNED INT 而不是 VARCHAR,您做对了。要转换回使用INET_ATON 存储的IP,您可以使用INET_NTOA 或PHP 的long2ip() 方法。现在只有我了解您的用例,所以我认为将相同的东西以不同的形式存储在 2 列中不是一个好主意,除非它对性能至关重要。 @ynos1234 我在谷歌上搜索了更多关于MySQL 函数的信息,它们很可能无法在其他地方工作(例如 SQLite),所以我需要使用 PHP 的函数。关于存储IP,感谢您向我确认...虽然我不明白您为什么提到两列和两种不同的形式。我从来没有提到以两种不同的形式存储 IP。你只是把我弄糊涂了…… 您可以尝试使用Views,另见performance issues with views。 SQLite 也支持视图,您可以在一定程度上“隐藏”实际代码/查询中的功能。 【参考方案1】:

INET_ATON() & INET_NTOA() // 所有这些都已弃用!请改用 inet_pton() 或 inet_ntop() !! 原因是它们不适用于 IPv6 地址,并且更多的互联网使用 IPv6 而不是 IPv4。

它们是 PHP 和 SQL 的同名函数,将 IP 地址转换为字符串,然后再返回。

【讨论】:

以上是关于从数据库表中全选——但在其中一列上使用函数的主要内容,如果未能解决你的问题,请参考以下文章

MYSQL XDev API Javascript 从表中全选

如何使用 MYSQL 中的连接从多个表中获取多个列并在非空列上显示数据以及在空列上显示 null 或零

SQL 更新表中的所有条目,但在列上插入不同的值

在每列上使用last_value函数下载表中的所有空值

MySQL:加入表并根据另一列上的聚合函数从一行返回一列[重复]

在 Windows 中全选和复制的最有效方法