like operator issue

后端 未结 3 1414
迷失自我
迷失自我 2021-01-27 14:06

I have a dom table

select * from dom

dom table details:

id    name     skills
1     do         


        
相关标签:
3条回答
  • 2021-01-27 14:27

    You need to use full text search or redesign your schema by extracting skills into a separate table and have M:N relation between Skill and Dom tables.

    0 讨论(0)
  • 2021-01-27 14:28

    in order to handle all possible cases (beginning of string, end of string, between 2 delimiters) you would need the inefficient (can't use an index)

    SELECT *
    FROM   dom
    WHERE  CONCAT(',', skills, ',') LIKE '%,C,%'
           AND CONCAT(',', skills, ',') LIKE '%,C++,%' 
    

    The best answer would be to put your database into at least first Normal Form!

    A separate skills table and skills/person matrix table is much more efficient to search and easier to work with (e.g. removing an individual skill)

    If you need a query that would bring back records in doms who match both C and C++ (assuming the same schema as jimmy_keen's answer) this could be done with a self join to get the intersection, the intersect operator, or using other relational division techniques such as

    SELECT d.name
    FROM   dom d
           JOIN dom_skills ds
             ON ( d.id = ds.id_dom )
           JOIN skills s
             ON ( ds.id_skill = s.id )
    WHERE  s.name IN ( 'C', 'C++' )
    GROUP  BY d.id,
              s.id,
              d.name
    HAVING COUNT(DISTINCT s.name) = 2 
    
    0 讨论(0)
  • 2021-01-27 14:37

    Skills column looks like something you might want to map with many-to-many relationship with your original "dom" table. For example:

    SKILLS      DOM         DOM_SKILLS
    id | name   id | name   id_dom | id_skill
    ---'-----   ---'-----   -------'---------
     1 | C       1 | dom        1  |  1 
     2 | C++                    1  |  2
    

    This way, your query might look bit more complex...

    SELECT d.name, s.name 
    FROM dom d 
    JOIN dom_skills ds ON (d.id = ds.id_dom) 
    JOIN skills s ON (ds.id_skill = s.id)
    WHERE s.name LIKE '%C%' OR s.name LIKE '%C++'
    

    ...but your schema will be easier to manage (think about duplicate entries, updating etc.. the normal form stuff, which is at the moment violated by your schema).

    0 讨论(0)
提交回复
热议问题