1

我需要执行一个 SQL 请求来提取一些数据。我不确定这是否可能,如果可以,我不知道该怎么做。我相信一个例子可以更好地展示我想做的事情。

让我们假设一个非常简单的表格:

--------------------------
| ID | domain            |
--------------------------
| 1  | example.com       |
--------------------------
| 2  | stackoverflow.com |
--------------------------

我想检索以指定字符串domain 结尾的条目。

如果用户输入是,我可以执行什么请求以便检索www.example.com其条目?domainexample.com

字符串www.example.com以 string 结尾example.com,这意味着我不能使用% LIKESQL 构造,因为我正在寻找谓词的子字符串。

这是一个潜在的肮脏解决方法,可以使其更清晰:

user_input = "www.stackoverflow.com"
for domain in get_all_domains_from_db():
    if user_input.endswith(domain):
        print "It's this one!"

Ps:如果有不清楚的地方请告诉我。

4

4 回答 4

1

通常你这样做:

SELECT * FROM tablename WHERE domain LIKE '%example.com'

我建议您永远不要获取和迭代数据库中的所有记录。这是一种仅适用于微量数据的技术。始终使用数据库为您进行过滤。

于 2013-07-29T15:51:09.243 回答
1

这将解决您的问题。

select * from table_name where :userParam like CONCAT('%', domain)

:userparam 将是 'www.example.com'

于 2013-07-29T17:23:22.420 回答
1

以下情况如何:

WHERE SUBSTRING_INDEX(domain, '.', -2) = SUBSTRING_INDEX(user_filter, '.', -2)

如果您的domain字段始终只是域本身(没有任何前缀),那么

WHERE domain = SUBSTRING_INDEX(user_filter, '.', -2)

这种方法无耻地借鉴http://dev.mysql.com/doc/refman/5.7/en/string-functions.html#function_substring-index

于 2013-07-29T16:31:03.490 回答
1

您可以沿.s 拆分用户输入,并尝试越来越短的序列。

一些类似python的伪代码:

user_input = "www.stackoverflow.com"
split_domain = user_input.split('.')
query = 'SELECT * FROM table WHERE domain = ' + '.'.join(split_domain)
while db_returns_no_rows(query) and split_domain:
    del split_domain[0]
    query = 'SELECT * FROM table WHERE domain = ' + '.'.join(split_domain)
于 2013-07-29T16:36:39.583 回答