我需要执行SQL请求来提取一些数据。我不确定是否可能,如果是的话,我不知道该怎么做。我相信一个例子可以更好地展示我想做的事情。
让我们假设一个非常简单的表:
--------------------------
| ID | domain |
--------------------------
| 1 | example.com |
--------------------------
| 2 | stackoverflow.com |
--------------------------
我想检索domain
结束指定字符串的条目。
如果用户输入为www.example.com
,我可以执行哪些请求,以便检索domain
为example.com
的条目?
字符串www.example.com
以字符串example.com
结束,这意味着我无法使用% LIKE
SQL构造,因为我正在寻找谓词的子字符串。
这是一个潜在的肮脏的解决方法,使其更清晰:
user_input = "www.stackoverflow.com"
for domain in get_all_domains_from_db():
if user_input.endswith(domain):
print "It's this one!"
Ps:如果不清楚,请告诉我。
答案 0 :(得分:1)
通常你这样做:
SELECT * FROM tablename WHERE domain LIKE '%example.com'
我建议你永远获取并迭代数据库中的所有记录。这是一种仅适用于大量数据的技术。始终使用数据库为您进行过滤。
答案 1 :(得分: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
无耻地借用答案 2 :(得分:1)
您可以沿.
分割用户输入,并尝试更短和更短的序列。
一些pythonlike伪代码:
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)
答案 3 :(得分:1)
这将解决您的问题。
select * from table_name where :userParam like CONCAT('%', domain)
:userparam将是“www.example.com”