具有正则表达式

时间:2017-06-13 15:04:41

标签: php mysql regex join

我需要编写一个非常复杂的mysql查询,它考虑了许多标准。我会尽力解释它。 我们有一张表格可以保存公司信息。还有另一个表格可以保存这些公司的约会,另一个表格包含这些约会的各种描述。我需要将所有3个表组合在一起,并根据用户的搜索参数生成结果。 表格看起来像这样

enter image description here

  • '公司'表中包含许多详细信息,如公司名称,邮政编码,地址,电话等。

  • '联系人'表中有一个' comp_id'对应于公司ID的单元格,一个名为“entrydate"”的时间戳条目。 (创建联系人时)和“约会”#39;设置约会时的单元格。 它也有一个“地位”状态。这个单元格只是' contact_status'包含约会描述的表(例如:紧急,低优先级等)

现在问题就在于此。 SQL是基于复杂的搜索表单创建的。因为公司内部有不同的部门,一些用户对数据库数据的访问权限不同......例如,邮政编码的搜索能力必须受到约束,各种状态也是如此。约会。 某些用户可以看到一定范围的邮政编码,或/和/只有特定的contact_statuses。因为邮政编码太多,参数是以#34; ...的形式给我的,而邮政编码并不是以558"开头的。因此,例如以55开头的拉链是(一些搜索)被接受但是如果它们以558开头则不是。所有这些都是通过php完成的。我可以创建if / else语句来为最终的mysql查询创建AND或WHERE行。到目前为止,我已经煮熟了#39;这个查询:

SELECT DISTINCT 
    a.id, a.comp_name, a.comp_zip, a.comp_addr
    c.description as status, b.appointdate as appointement
    FROM
      Companies a
      LEFT JOIN Contacts b ON b.comp_id = a.id
      LEFT JOIN Contact_Status c ON c.id = b.status
      WHERE a.caller_id = '45346'
      AND (b.status NOT IN ( '2', '3', '5' ) OR b.status IS NULL)
      AND (a.comp_zip NOT REGEXP '50(.*)|54(.*)|55(.*)|532(.*)|668(.*)|669(.*)')
      ORDER BY a.id
            DESC

但它没有带来正确的结果。例如,我只想说公司有邮政编码77554.它不会带来这家公司,因为正则表达式可能是错误的。它识别了拉链内的55,它忽略了这家公司。 我认为正确的方式可能是:'^50(.*)|^54(.*)|^55(.*)....'但我不确定......我需要确定这一点。这就是我创建这篇文章的原因。我无法在网上找到相关信息。

检查多个'类似'的正确方法是什么? reg expr的值。从某事开始? 感谢

1 个答案:

答案 0 :(得分:1)

您实际上需要在REGEXP的开头添加^,并将内容包装在()中。尝试:^(50(.*)|54(.*)|55(.*)|532(.*)|668(.*)|669(.*))

^()将确保值开头。

为清楚起见,这将是您的查询:

SELECT DISTINCT 
    a.id, a.comp_name, a.comp_zip, a.comp_addr
    c.description as status, b.appointdate as appointement
FROM
  Companies a
  LEFT JOIN Contacts b ON b.comp_id = a.id
  LEFT JOIN Contact_Status c ON c.id = b.status
  WHERE a.caller_id = '45346'
  AND (b.status NOT IN ( '2', '3', '5' ) OR b.status IS NULL)
  AND (
     a.comp_zip NOT 
     REGEXP '^(50(.*)|54(.*)|55(.*)|532(.*)|668(.*)|669(.*))' -- changed this part
  ) 
  ORDER BY a.id DESC