php - 无法将 mysql 查询放在一起

标签 php mysql sql

我正在使用以下 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/

相关文章:

php - ORDER BY RAND() 返回重复项

php - 使用 ZipArchive 提取文件夹内容

mysql - 我需要一些帮助让 MySql 使用子查询输出一些结果

sql - 如何使用 TSQL 获取 SQL Server 中两个表之间关系的基数?

mysql - 以 "0"为值的 SQL 列

php - 行已删除,但PHP并未真正从数据库中删除+没有错误消息

php - HTML POST 表单不向 PHP 脚本发送任何数据

Mysql同时更新表

php - CodeIgniter 其中值 IN (Field1,Field2)

mysql - SQL分组相同的名字