Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/250.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 使用LIKE将数据从一个表匹配到另一个表_Php_Mysql - Fatal编程技术网

Php 使用LIKE将数据从一个表匹配到另一个表

Php 使用LIKE将数据从一个表匹配到另一个表,php,mysql,Php,Mysql,我想知道您能否将数据从一个表匹配到另一个表(下面的示例) 如果我想将我的第二个表链接到第一个表,并将城市id添加到我的标题中,该怎么办 First Table (Cities) | Second Table (Headlines) ______________________________________________________ id: 1 name: New-York | Something happened in New-York id: 2 nam

我想知道您能否将数据从一个表匹配到另一个表(下面的示例)

如果我想将我的第二个表链接到第一个表,并将城市id添加到我的标题中,该怎么办

    First Table (Cities) | Second Table (Headlines)
    ______________________________________________________
    id: 1 name: New-York | Something happened in New-York
    id: 2 name: LA       | Something else happened in LA
                         | Somehting happened in LA and New-York
我想我需要做一些类似的事情:

 SELECT * FROM headlines where headline LIKE %$city%
      on concat(' ', replace(replace(replace(h.headline, ',', ' '), ':', ' '), '.', ' '), ' ') like
               concat('% ', c.city, ' %')
然后在我收到归还的东西时插入所有内容。但是,每次我添加一个新的标题时,我都需要重复我对100个城市的查询

    First Table (Cities) | Second Table (Headlines)
    ______________________________________________________
    id: 1 name: New-York | Something happened in New-York
    id: 2 name: LA       | Something else happened in LA
                         | Somehting happened in LA and New-York

有人能告诉我要做什么吗?

你可以使用一个带有
like
条件的
join
子句:

 SELECT h.*, c.cities
 FROM headlines h join
      cities c
      on h.headline like concat('%', c.city, '%')
关键是使用
concat()
获取模式中的通配符参数

顺便说一句,这将执行一个嵌套循环查询,这将不会很好地执行。由于类似的情况,索引将无助于提高性能

更好的方法是在
headline
列上建立全文索引,并使用
match
进行比较。这也将有助于防止类似“伦敦”与“伦敦德里”的冲突

而且,在您的示例中,
LA
特别有问题,因为许多单词包含
LA
。您可以尝试以下方法:

 SELECT * FROM headlines where headline LIKE %$city%
      on concat(' ', replace(replace(replace(h.headline, ',', ' '), ':', ' '), '.', ' '), ' ') like
               concat('% ', c.city, ' %')
也就是说,将标点替换为空格,在标题的开头和结尾添加空格,然后查找被空格包围的城市名称。这会阻止“LA”和“AtLAnta”之间的匹配(大写仅用于强调)。

您可以试试这个

$sql = "SELECT * FROM cities";
$res_mysql=mysql_query($sql);  
   while($arr=mysql_fetch_array($res_mysql)){
      while(mysql_fetch_array($res_mysql_like)){
          $update= "UPDATE `Headlines` SET `id` ='".$arr[1]."'
          WHERE `headline LIKE %$arr[1]%";
      mysql_query($update)
      or die(mysql_error());
      }
   }
您需要从城市表中选择第一个id,并检查是否出现在标题表中,然后对城市表执行相同的白色2 id


我希望这能帮助你,也许我不太了解这个问题,mi的英语水平不是很好。

我不知道你在问什么,因为你没有解释它的实际应用。。。如果不了解应用程序,就很难说你是否应该做些什么,因为我们需要能够权衡我们自己的方法和你的方法。你是说每次添加标题(由用户?由谁?)时,它都会将一个新城市添加到城市表中?标题将从不同的新闻网站上删除。但我认为戈登下面的答案正是我想要的。你能更详细地描述一下你认为更好的方法是什么吗?(我是MySQL的新手)@metareviewr。如果你正在做一个快速而肮脏的一次性比较,让
一样工作就可以了。如果您想多次这样做,那么考虑全文索引。详细信息最好留给文档。我会调查的。非常感谢。我尝试了你的查询,效果很好,但当我所在的城市处于诸如“纽约”之类的省略号之间时,它似乎忽略了。无论如何,再次谢谢你!显然,全文搜索不会将另一个列名作为反对的参数。