我需要编写一个非常复杂的mysql查询,它考虑了许多标准。我会尽力解释它。 我们有一张表格可以保存公司信息。还有另一个表格可以保存这些公司的约会,另一个表格包含这些约会的各种描述。我需要将所有3个表组合在一起,并根据用户的搜索参数生成结果。 表格看起来像这样
'公司'表中包含许多详细信息,如公司名称,邮政编码,地址,电话等。
'联系人'表中有一个' 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的值。从某事开始? 感谢
答案 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