回答

收藏

将布尔表达式解析为PHP中的MySql查询

技术问答 技术问答 261 人阅读 | 0 人回复 | 2023-09-12

这是唯一的两个手表。不要打扰别人。
7 n  x/ L1 u& ]! N% w1 K* r- D) Umysql> describe skill_usage; ---------- --------- ------ ----- --------- ------- | Field    | Type    | Null | Key | Default | Extra | ---------- --------- ------ ----- --------- ------- | skill_id | int(11) | NO   | MUL | NULL    |       || job_id   | int(11) | NO   | MUL | NULL    |       | ---------- --------- ------ ----- --------- ------- mysql> describe skill_names; ------------ ---------- ------ ----- --------- ---------------- | Field      | Type     | Null | Key | Default | Extra          | ------------ ---------- ------ ----- --------- ---------------- | skill_id   | int(11)  | NO   | PRI | NULL    | auto_increment || skill_name | char(32) | NO   | MUL | NULL    |                | ------------ ---------- ------ ----- --------- ---------------- 基本上,用户使用技能名输入布尔搜索字符串。$ E  P" m+ Q$ V, f' ]3 a6 V
我将把技能名称转换为skill_id,然后希望通过分析用户的搜索字符串来生成MySql查询以job_id从table获得所有匹配项skill_usage。$ i( s* i( g$ U. C0 M5 Q
字符串可以包含技能名称,操作符AND和OR,还有优先括号。& |& \. `9 J$ [+ r/ i" B4 ?
有些例子可能是
" I; A) L. ~: X/ u0 G% XC- M$ T) W/ b% n3 Y5 v- i3 S+ Z
C或C   
* Q: K: z' Q% f$ w/ AC   和UML8 R( m7 X5 V5 h3 I
(C AND内核)或(C    AND UML)
但表达的复杂性没有限制-这就是我的问题。
+ t5 Y' R8 ]9 b% D9 `1 ~我不是SQL专家,如果我错了,请纠正我。我想我想开始SELECT job_id FROM skill_usage然后进行分析,并建立其他查询。& ~9 K( |0 Q# Q- D. M( ~
对于第一个例子,我想添加一个技能名称C WHERE skillId = X,其中X它是从表中获得的skill_names。
& [' V1 H2 r+ x( S2 e/ J对于简单的ORlike C OR C  ,我可以用一个IN子句- WHERE skillId IN (X,Y)(同样,X&Y搜索技能名称以获得a skill_id)。/ Q5 S6 j- K4 }  t$ x3 r6 E! S
简单的ANDlike C   AND UML,我想我需要一个INNER JOINlike,WHERE skill_id = XINNER JOIN skill_usage ON skill_usage.skill_id = Y(其中skill_idC是C+ R' y# ^, f0 B' C( W/ Z; B$ u
        的X,UML是Y的)。
7 x: m& i: R# H" N对于那些简单的情况(?),我觉得大致正确。
; |# E- A- B( i然而,当我遇到更复杂的案例时,比如这样(C AND kernel) OR (C   AND UML),我会感到困惑。/ a/ T' y" X; p- S3 M0 \4 z! X( V
正则表达式或算法在这里合适吗?
- m) j6 x  `- p@AnthonyVall茅e-6 |& N( B% n# X3 c  m+ O. Z2 Y
Dubois我似乎可以修改这个问题的答案,但它似乎很复杂。我想简化一些事情,但我不确定如何开始(PHP编码不是我的问题,只是正则表达式或算法)。1 X- n/ ]: R) @6 V& |
更新我试图将分析与查询分开,并利用这个问题来整理查询。
! d& |1 K) N! V( Q- L2 f1 `( {" v我正在得到这样的答案! N7 g# U% i# S: g
SELECT job_idFROM skill_usageWHERE skill_id IN (3,4)GROUP BY job_idHAVING MIN(skill_id)  MAX(skill_id);和
8 W  |1 t3 H- m: F. q5 hselect s1.job_id  from skill_usage s1  where s1.skill_id = 3    and s1.job_id in              select s2.job_id                         from skill_usage s 2                                                                                                                                                                                                                                                                                                                                                                                                                                      where s2.skill_id =                 后者看起来更可扩展。
4 K& V, }2 u: z/ T而我用于PHP将搜索字符串转换为SQL查询的伪代码大致是
6 i# u% a; j+ r) ~7 V. Pfail if mis-matched bracketsreduce multiple spaces to singleremoves spaces before and after closing/opening bracket  "( " & " )"foreach c in string   if c == (   else      if c === )      else         if AND         else           if OE           else              # it's a skill name               
9 I  x# l  f. m0 ^" v- ?1 }2 d    解决方案:
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则