我正在使用以下mysql查询从我的数据库中返回一些数据。目前只有cities
表中有任何内容,我注意到此查询只返回它找到的第一个匹配条目,而不是它找到的所有匹配条目。有没有办法可以修改这个查询,以便它返回所有表中的所有匹配结果?
这个想法是,如果我去$ query ='h',那么查询应该返回以h开头的所有事件,场所和城市。
SELECT name, 'Events' as source
FROM events
WHERE name LIKE '".$query."%'
UNION ALL
SELECT name, 'Venues' as source
FROM venues
WHERE name LIKE '".$query."%'
UNION ALL
SELECT name, 'Cities' as source
FROM cities
WHERE name LIKE '".$query."%'
OR FIND_IN_SET('".$query."%', Alternate_name)
请解释我如何修复它,而不仅仅是发布解决方案。我还在学习,想要明白。
修改
替换后的查询(包含字母h的$ query变量):
SELECT name, id, 'Events' as source FROM events_basic WHERE name LIKE 'h%' UNION ALL
SELECT name, fsq_id, 'Venues' as source FROM venues_cache WHERE name LIKE 'h%' UNION ALL
SELECT name, geo_id, 'Cities' as source FROM static_cities WHERE name LIKE 'h%' OR FIND_IN_SET('h%', alternate_names)
我使用的php代码如下: `
$query = 'h';
$query = $this->db->query("SELECT name, 'Events' as source FROM events WHERE name LIKE ".$query."%' UNION ALL
SELECT name, 'Venues' as source FROM venues WHERE name LIKE '".$query."%' UNION ALL
SELECT name, 'Cities' as source FROM cities WHERE name LIKE '".$query."%' OR IND_IN_SET('".$query."%', Alternate_name)");
if($query->num_rows > 0)
{
$results = $query->row_array();
print_r($results);
}`
这个想法是变量$ query保存事件,城市或地点的名称或部分名称。然后,查询应返回与给定名称匹配的事件,场所和城市的名称。我希望我已经澄清了,如果没有,我会试着澄清更多。
答案 0 :(得分:0)
WHERE子句中FIND_IN_SET的预期结果是什么?根据您提供的信息,您应该可以省略它。
如果您希望匹配表中的其他城市名称,请考虑以下事项:
WHERE name LIKE '".$query."%' OR alternate_name LIKE '".$query."%';
请确保您正在清理您的输入。有人可能会使$ query ='1; DROP TABLE场地;'
答案 1 :(得分:0)
您可以在替换之后发布SQL查询吗?在我看来,你将第二个单引号字符放在连接中的错误位置,产生短语(例如)WHERE name LIKE 'h'%
而不是WHERE name LIKE 'h%'
(注意位置的差异)第二版中的第二个引用)。
如果您的城市名称为H(仅H)或名称列表中的替代品仅为“H”,则会导致您看到的情况。这是真的吗?
另外,既然你要求解释:
将备用城市名称放在单个逗号分隔字段中的技术违反了数据库规范化的原则。 “正确”的结构是创建一个包含两列“name”和“alternate”的新表。具有备用名称的城市在备用表中为每个备用名称获取一个条目。除此之外,这将允许您对备用名称的搜索使用当前版本中城市搜索无法使用的索引。
您必须非常非常确定您已经“清理”了变量$ query的内容,以确保某人没有在您的站点上启动SQL注入攻击(他们在其中编写实际的SQL命令)查询字段)。更好的是,查看并使用参数化查询,让服务器为您执行此替换。