我正在使用以下 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 保存事件、城市或地点的名称或部分名称。然后查询应返回与给定名称匹配的事件、地点和城市的名称。我希望我已经解释得足够清楚了,如果没有,我会尝试澄清更多。
最佳答案
替换完成后,您能否发布 SQL 查询?在我看来,您将第二个单引号字符放在连接中的错误位置,产生了短语(例如) WHERE name LIKE 'h'%
而不是 WHERE name LIKE 'h%'
(注意第二个版本中第二个引号的位置不同)。
如果您的城市名称为 H(仅 H)或名称列表中的替代名称仅为“H”,这将导致您看到的情况。是真的吗?
另外,既然你要求解释:
您将备用城市名称放置在单个逗号分隔字段中的技术违反了数据库规范化的原则。 “正确”的结构是创建一个包含两列“name”和“alternate”的新表。具有备用名称的城市在备用表中为每个备用名称获取一个条目。除其他事项外,这将允许您针对备用名称的搜索使用索引,这在当前版本的城市搜索中是不可能的。
您必须非常非常确定您已经“清理”了变量 $query 的内容,以确保有人不会对您的网站发起 SQL 注入(inject)攻击(他们将实际的 SQL 命令写入其中查询字段)。更好的是,查看并使用让服务器为您执行此替换的参数化查询。
关于php - 无法将 mysql 查询放在一起,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7373547/