【发布时间】:2015-09-04 15:21:31
【问题描述】:
我有这段代码可以在 MYSQL 数据库中搜索匹配结果:
$where[] = 'p.id IN (
SELECT adcfvc.advert_id
FROM #__koparent_advert_specific_fields_values AS adcfvc
WHERE adcfvc.advert_id = p.id
AND adcfvc.field_name = ' . $db->Quote($sf_key) . '
AND ' . $db->Quote(JString::strtolower($sf_value)) . ' = adcfvc.field_value
)';
我想将上述搜索查询从使用等号“=”运算符选择完全匹配更改为使用带有两个通配符“%adcfvc.field_value%”的“LIKE”运算符选择任何匹配结果。
换句话说:上述代码的当前作用是,当用户搜索“Hello my people”时,查询将搜索确切的单词。 但是,我希望用户能够仅使用“Hello”或“people”一词进行搜索,并且他会得到包括“Hello my people”在内的所有结果。
知道无论如何我都无法更改任何数据库结构,只需修改上面的代码即可。
名为“query.php”的整个代码文件位于: http://123dizajn.com/boltours/stackex/query.txt 我无法在此处粘贴整个代码,因为它超出了正文限制,并且它已重命名为 query.txt 以供查看。
试用#1h2>
所以,我尝试只替换(在代码的最后):
= adcfvc.field_value
与:
LIKE %adcfvc.field_value%
没有成功:(
试用#2
我试图颠倒查找顺序并使用多个逻辑运算符:-
$where[] = 'p.id IN (
SELECT adcfvc.advert_id
FROM #__koparent_advert_specific_fields_values AS adcfvc
WHERE adcfvc.advert_id = p.id
AND adcfvc.field_name = ' . $db->Quote($sf_key) . '
AND
(adcfvc.field_value > ' . $db->Quote(JString::strtolower($sf_value)) . '
OR adcfvc.field_value < ' . $db->Quote(JString::strtolower($sf_value)) . '
OR adcfvc.field_value = ' . $db->Quote(JString::strtolower($sf_value)) . ')
)';
但这会返回所有项目,而不是搜索到的项目!
试用#3
我也尝试反转并使用LIKE %...%:-
$where[] = 'p.id IN (
SELECT adcfvc.advert_id
FROM #__koparent_advert_specific_fields_values AS adcfvc
WHERE adcfvc.advert_id = p.id
AND adcfvc.field_name = ' . $db->Quote($sf_key) . '
AND adcfvc.field_value LIKE %' . $db->Quote(JString::strtolower($sf_value)) . '%
)';
但这会返回错误:
1064 您的 SQL 语法有错误;检查手册 对应于您的 MySQL 服务器版本,以便使用正确的语法 靠近 '%'apartment'%) GROUP BY p.id ORDER BY
ap.priceDESC LIMIT 0, 20' 在第 12 行 SQL=SELECT p., p.id AS id, p.title AS title, p.street_num、p.street、p.description 作为描述、ap.price、pr.name 作为 priceName,usr.id 作为 advert_user_id,countries.title 作为 country_name,states.title 作为 state_name,date_format(p.created, '%Y-%m-%d') 作为 fcreated,c.title 作为 category_title,c.id 作为 category_id 来自b1yvu_koparentASp左加入b1yvu_koparent_advert_pricesASapON ap.advertId = p.id AND ap.advertDateRangeGroupId = 0 AND ap.priceId = p.priceUnitId 左连接b1yvu_koparent_pricesASprON pr.id = p.priceUnitId 左连接b1yvu_koparent_advertmidASpmON pm.advert_id = p.id 左连接b1yvu_koparent_usermidASamON am.advert_id = p.id 左连接b1yvu_koparent_usersASusrON usr.id = am.user_id 左连接b1yvu_koparent_categoriesAScON c.id = pm.cat_id 左连接b1yvu_koparent_advert_specific_fields_valuesASasfv开启 asfv.advert_id = p.id 左连接b1yvu_koparent_countriesAScountriesON countries.id = p.country LEFT JOINb1yvu_koparent_statesASstatesON states.id = p.locstate WHERE p.published = 1 AND p.approved = 1 AND c.published = 1 AND (p.publish_up = '0000-00-00' 或 p.publish_up = '2015-09-05')和 (c.publish_up = '0000-00-00' 或 c.publish_up = '2015-09-05')和 p.access IN (1,9) AND c.access IN (1,9) AND c.language IN ('en-GB','') AND p.language IN ('en-GB','*') AND p.id IN (SELECT adcfvc.advert_id FROM b1yvu_koparent_advert_specific_fields_values AS adcfvc WHERE adcfvc.advert_id = p.id AND adcfvc.field_name = 't4_cust_AdvertTitleEN' AND adcfvc.field_value LIKE %'apartment'%) GROUP BY p.id ORDER BYap.priceDESC LIMIT 0, 20
任何帮助或建议表示赞赏。
【问题讨论】:
-
认为你已经搞错了,试试
adcfvc.field_value LIKE "%' . $db->Quote(JString::strtolower($sf_value)) . '%" -
您是否尝试在字符串周围添加单引号? LIKE '%adcfvc.field_value%' 你必须在 php 代码中转义单引号。
-
@swornabsent 嗯,页面加载成功,但是建议的查询根本不起作用。
-
@mk97 我不知道如何“转义 php 代码中的单引号”。你能告诉我直接尝试什么吗?